<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://jogamp.org/bugzilla/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.2"
          urlbase="https://jogamp.org/bugzilla/"
          
          maintainer="sgothel@jausoft.com"
>

    <bug>
          <bug_id>356</bug_id>
          
          <creation_ts>2008-06-01 05:02:12 +0200</creation_ts>
          <short_desc>TextRenderer causes a GLException on pre-OpenGL 1.5 version</short_desc>
          <delta_ts>2012-01-23 00:08:37 +0100</delta_ts>
          <reporter_accessible>0</reporter_accessible>
          <cclist_accessible>0</cclist_accessible>
          <classification_id>3</classification_id>
          <classification>JogAmp</classification>
          <product>Jogl</product>
          <component>awt</component>
          <version>1</version>
          <rep_platform>All</rep_platform>
          <op_sys>all</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sven Gothel">sgothel</reporter>
          <assigned_to name="Sven Gothel">sgothel</assigned_to>
          
          
          <cf_type>DEFECT</cf_type>
          <cf_scm_refs></cf_scm_refs>
          <cf_workaround>---</cf_workaround>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>372</commentid>
    <comment_count>0</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2010-03-24 07:51:28 +0100</bug_when>
    <thetext>


---- Reported by javalution 2008-06-01 05:02:13 ----

On JOGL 1.1.1 release candidate 5, the JVM crashes completely and produces a log
file. The other release candidates (rc6, rc7 and rc8) and the stable current
version produces the following trace:

Exception in thread &quot;AWT-EventQueue-0&quot; javax.media.opengl.GLException: array
vertex_buffer_object must be disabled to call this method
       at com.sun.opengl.impl.GLImpl.checkBufferObject(GLImpl.java:30667)
       at com.sun.opengl.impl.GLImpl.checkArrayVBODisabled(GLImpl.java:30715)
       at com.sun.opengl.impl.GLImpl.glVertexPointer(GLImpl.java:27936)
       at
com.sun.opengl.util.j2d.TextRenderer$Pipelined_QuadRenderer.drawVertexArrays(TextRenderer.java:1771)
       at
com.sun.opengl.util.j2d.TextRenderer$Pipelined_QuadRenderer.draw(TextRenderer.java:1745)
       at
com.sun.opengl.util.j2d.TextRenderer$Pipelined_QuadRenderer.access$000(TextRenderer.java:1687)
       at
com.sun.opengl.util.j2d.TextRenderer.flushGlyphPipeline(TextRenderer.java:809)
       at com.sun.opengl.util.j2d.TextRenderer.endRendering(TextRenderer.java:705)
       at com.sun.opengl.util.j2d.TextRenderer.endRendering(TextRenderer.java:541)
       at HelloWorldDemo.display(HelloWorldDemo.java:82)
       at com.sun.opengl.impl.GLDrawableHelper.display(GLDrawableHelper.java:78)
       at javax.media.opengl.GLCanvas$DisplayAction.run(GLCanvas.java:435)
       at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:194)
       at
javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:412)
       at javax.media.opengl.GLCanvas.display(GLCanvas.java:244)
       at javax.media.opengl.GLCanvas.paint(GLCanvas.java:277)
       at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248)
       at sun.awt.X11.XRepaintArea.paintComponent(XRepaintArea.java:56)
       at sun.awt.RepaintArea.paint(RepaintArea.java:224)
       at sun.awt.X11.XComponentPeer.handleEvent(XComponentPeer.java:683)
       at java.awt.Component.dispatchEventImpl(Component.java:4489)
       at java.awt.Component.dispatchEvent(Component.java:4243)
       at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
       at
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
       at
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
       at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
       at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Exception in thread &quot;Thread-1&quot; javax.media.opengl.GLException:
javax.media.opengl.GLException: array vertex_buffer_object must be disabled to
call this method
       at javax.media.opengl.Threading.invokeOnOpenGLThread(Threading.java:271)
       at
javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:410)
       at javax.media.opengl.GLCanvas.display(GLCanvas.java:244)
       at com.sun.opengl.util.Animator.display(Animator.java:144)
       at com.sun.opengl.util.Animator$MainLoop.run(Animator.java:181)
       at java.lang.Thread.run(Thread.java:619)
Caused by: javax.media.opengl.GLException: array vertex_buffer_object must be
disabled to call this method
       at com.sun.opengl.impl.GLImpl.checkBufferObject(GLImpl.java:30667)
       at com.sun.opengl.impl.GLImpl.checkArrayVBODisabled(GLImpl.java:30715)
       at com.sun.opengl.impl.GLImpl.glVertexPointer(GLImpl.java:27936)
       at
com.sun.opengl.util.j2d.TextRenderer$Pipelined_QuadRenderer.drawVertexArrays(TextRenderer.java:1771)
       at
com.sun.opengl.util.j2d.TextRenderer$Pipelined_QuadRenderer.draw(TextRenderer.java:1745)
       at
com.sun.opengl.util.j2d.TextRenderer$Pipelined_QuadRenderer.access$000(TextRenderer.java:1687)
       at
com.sun.opengl.util.j2d.TextRenderer.flushGlyphPipeline(TextRenderer.java:809)
       at com.sun.opengl.util.j2d.TextRenderer.endRendering(TextRenderer.java:705)
       at com.sun.opengl.util.j2d.TextRenderer.endRendering(TextRenderer.java:541)
       at HelloWorldDemo.display(HelloWorldDemo.java:82)
       at com.sun.opengl.impl.GLDrawableHelper.display(GLDrawableHelper.java:78)
       at javax.media.opengl.GLCanvas$DisplayAction.run(GLCanvas.java:435)
       at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:194)
       at
javax.media.opengl.GLCanvas$DisplayOnEventDispatchThreadAction.run(GLCanvas.java:452)
       at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199)
       at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
       at
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
       at
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
       at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
       at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

The problem is reproducible only with graphics cards that are not at least
compatible with OpenGL 1.5. When I use both VBOs and a TextRenderer, I get the
exception trace above with the following source code:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.nio.FloatBuffer;

import com.sun.opengl.util.Animator;
import com.sun.opengl.util.BufferUtil;
import com.sun.opengl.util.j2d.TextRenderer;
import javax.media.opengl.GL;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;

public class HelloWorldDemo extends Frame implements GLEventListener{
    
    private static final long serialVersionUID = 1L;
    private TextRenderer textRenderer;
    private int[] id=new int[1];
    private FloatBuffer buffer=BufferUtil.newFloatBuffer(0);
    
    public HelloWorldDemo(){
        super(&quot;JOGL 1.1.1&quot;);
        setLayout(new BorderLayout());
        setSize(400, 400);
        setLocation(40, 40);
        setVisible(true);
        GLCapabilities caps = new GLCapabilities();
        caps.setDoubleBuffered(true);
        caps.setHardwareAccelerated(true);
        GLCanvas canvas = new GLCanvas(caps);
        canvas.addGLEventListener(this);
        add(canvas, BorderLayout.CENTER);
        Animator anim = new Animator(canvas);
        anim.start();
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        buffer.put(new float[]{});
        buffer.position(0);
    }

    
    public void init(GLAutoDrawable drawable){
        GL gl = drawable.getGL();
        gl.glClearColor(0, 0, 0, 0);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrtho(0, 1, 0, 1, -1, 1);
        textRenderer=new TextRenderer(new Font(&quot;SansSerif&quot;,Font.PLAIN,12));
        gl.glGenBuffers(1,id,0);
        gl.glBindBuffer(GL.GL_ARRAY_BUFFER,id[0]);
       
gl.glBufferData(GL.GL_ARRAY_BUFFER,BufferUtil.SIZEOF_FLOAT*buffer.capacity(),buffer,GL.GL_STATIC_DRAW_ARB);
        this.buffer.position(0);
    }

    public void reshape(GLAutoDrawable drawable,
                        int x,
                        int y,
                        int width,
                        int height){
    }

    public void displayChanged(GLAutoDrawable drawable,
                               boolean modeChanged,
                               boolean deviceChanged){
    }

    public void display(GLAutoDrawable drawable){
        GL gl = drawable.getGL();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT);
        gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY);
        gl.glBindBuffer(GL.GL_ARRAY_BUFFER,id[0]);
        gl.glDrawArrays(GL.GL_QUADS,0,0);
        gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY);       
        gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
        textRenderer.beginRendering(100,100);
        textRenderer.draw(&quot;JOGL 1.1.1&quot;,0,0);
        textRenderer.endRendering();       
        gl.glFlush();
    }

    public static void main(String[] args){
        HelloWorldDemo demo = new HelloWorldDemo();
        demo.setVisible(true);
    }
}



---- Additional Comments From javalution 2008-06-01 05:03:57 ----

Created an attachment
Log file obtained when the JVM crashed with JOGL 1.1.1 release candidate 5




---- Additional Comments From javalution 2008-06-01 05:10:07 ----

Created an attachment
source code to reproduce the bug easily




---- Additional Comments From javalution 2008-06-01 07:41:16 ----

I have found a workaround that works sometimes.

Explicitly unbind the last buffer you use by doing this:
gl.glBindBuffer(GL.GL_ARRAY_BUFFER,0);

It should not be required except if you don&apos;t use the same mechanism to check if
VBO extensions are available... that&apos;s the case of TUER. JOGL tests if OpenGL
1.5 is available and if it can bind a buffer (if there is no exception by using
a try catch clause), then it considers that VBO extensions are available. TUER
(WWJ and other engines too) uses a finer method. It checks only once if the
functions and the VBO extensions are both available. Then, under OpenGL 1.4, if
ARB VBO extensions are available, TUER uses VBOs and JOGL doesn&apos;t use them and
ignores the case of someone using VBOs. Here is the modification to do to allow
this to work in all cases (not yet tested as I don&apos;t succeed in building JOGL):

in com.sun.opengl.util.j2d.TextRenderer:
...
[color=red][b]private boolean bindBufferAvailable;[/b][/color]
...
public TextRenderer(Font font, boolean antialiased,
                        boolean useFractionalMetrics, RenderDelegate renderDelegate,
                        boolean mipmap){
[color=red][b]GL gl = GLU.getCurrentGL();
bindBufferAvailable = gl.isFunctionAvailable(&quot;glBindBufferARB&quot;) ||
gl.isFunctionAvailable(&quot;glBindBuffer&quot;);[/b][/color]
...
}

in com.sun.opengl.util.j2d.TextRenderer$Pipelined_QuadRenderer.drawVertexArrays()

......
if (usingVBOs) {
                    gl.glBindBuffer(GL.GL_ARRAY_BUFFER,
                                    mVBO_For_ResuableTileVertices);
                    gl.glBufferSubData(GL.GL_ARRAY_BUFFER, 0,
                                       mOutstandingGlyphsVerticesPipeline *
kSizeInBytes_OneVertices_VertexData,
                                       mVertCoords); // upload only the new stuff
                    gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
                } else {
                    [color=red][b]if(bindBufferAvailable)
                         gl.glBindBuffer(GL.GL_ARRAY_BUFFER,0);//unbinds any
already bound buffer[/b][/color]
                    gl.glVertexPointer(3, GL.GL_FLOAT, 0, mVertCoords);
                }



---- Additional Comments From javalution 2008-06-01 08:01:35 ----

The workaround always works if it is called just before beginRendering() and
begin3DRendering().



---- Additional Comments From javalution 2008-06-02 12:59:21 ----

Created an attachment
Cleanest bug fix (force the use of VBO on OpenGL 1.4 if GL_ARB_vertex_buffer_object is available)




---- Additional Comments From javalution 2008-06-02 23:58:14 ----

Created an attachment
Cleanest bug fix version 2 (GL_ARB_vertex_buffer_object can be supported in OpenGL 1.3 on some graphics cards)




---- Additional Comments From kbr 2008-06-03 02:09:03 ----

This fix doesn&apos;t do what you think it does and frankly I don&apos;t see how it can
possibly change the behavior. With this fix the sequence of operations is as
follows:

 - The TextRenderer thinks it has VBOs available
 - It attempts to call glBindBuffer
 - This fails because OpenGL 1.5 is not available
 - It falls back to the vertex array implementation
 - It calls glVertexPointer with a Buffer as argument even though a VBO is
already bound and should fail in the same way as before

If you want to add a code path for ARB_vertex_buffer_object you are going to
need to change the calls to glBindBuffer, etc. to instead call glBindBufferARB
in this case.




---- Additional Comments From javalution 2008-06-03 05:01:37 ----

I don&apos;t succeed in building JOGL, it doesn&apos;t help... When you call glBindBuffer
under OpenGL 1.3 through JOGL 1.1.1, it works like glBindBufferARB, my graphics
card is compatible with OpenGL 1.3 (ATI Radeon 9250 Pro) and using glBindBuffer
works, I tested this point, I replaced all calls of glBindBufferARB by
glBindBuffer and this didn&apos;t fail. The indirect rendering by Mesa supports only
OpenGL 1.2, therefore it doesn&apos;t come from this. With this fix, the sequence of
operations should be:
- The TextRenderer thinks it has VBOs available
- It attempts to call glBindBuffer
- It works as glBindBuffer points on glBindBufferARB
Did you test my fix with graphics cards compatible with OpenGL 1.4 or OpenGL 1.3
only?
Could you include my fix in the nightly build to allow me to test it or do you
prefer me to try again to build JOGL with my fix before adding it into the
nightly build?



---- Additional Comments From javalution 2008-06-03 05:46:01 ----

Created an attachment
Cleanest bug fix version 3 following Kenneth Russell&apos;s suggestions




---- Additional Comments From kbr 2008-06-03 09:09:01 ----

You must test and validate your own fix before I will consider checking it in. I
do not have access to graphics cards supporting only OpenGL 1.3 / 1.4 any more.




---- Additional Comments From javalution 2008-06-03 12:39:40 ----

Created an attachment
Cleanest bug fix version 4 (tested, works but has poor performance)




---- Additional Comments From javalution 2008-06-03 12:43:17 ----

The versions 2 and 3 of the bug fix crashes the JVM. The version 4 works but has
very poor performance. I don&apos;t find a competitive solution. Please investigate.
I don&apos;t understand why the JVM crashes on glDrawArrays after some seconds.



---- Additional Comments From javalution 2008-08-19 13:44:27 ----

Created an attachment
Final cleanest fix, tested under OpenGL 1.3




---- Additional Comments From javalution 2008-08-19 13:47:49 ----

The latest bug fix works good. The impact on the performance is not really
noticeable if and only if you use VBOs whose element count is less than
GL_MAX_ELEMENTS_VERTICES.

I tried other approaches some weeks but the JVM crashed several times. This fix
is the only reliable and performant solution I have found. Please include it in
the nightly build as soon as possible.



---- Additional Comments From javalution 2008-08-19 14:18:34 ----

Created an attachment
Fix handling the crash with Intel chips and working with OpenGL 1.4 too




---- Additional Comments From javalution 2008-08-19 14:19:57 ----

Please test the latest fix with an Intel on-board graphics and under OpenGL 1.4
as I don&apos;t have such things at home. I had forgotten some try/catch. Now, it
should be fine.



---- Additional Comments From javalution 2008-09-12 16:57:26 ----

Sorry. The fix doesn&apos;t work fine on some versions of Mesa, TUER crashes after 99
seconds, the JVM writes a log file. I have had to use the older implementation
to fix the bug. glBindBufferARB seems to be very unstable when used to unbind a
buffer.



--- Bug imported by sgothel@jausoft.com 2010-03-24 07:51 EDT  ---

This bug was previously known as _bug_ 356 at https://jogl.dev.java.net/bugs/show_bug.cgi?id=356
Imported an attachment (id=126)
Imported an attachment (id=127)
Imported an attachment (id=128)
Imported an attachment (id=129)
Imported an attachment (id=130)
Imported an attachment (id=131)
Imported an attachment (id=132)
Imported an attachment (id=133)

The original submitter of attachment 126 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.
The original submitter of attachment 127 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.
The original submitter of attachment 128 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.
The original submitter of attachment 129 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.
The original submitter of attachment 130 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.
The original submitter of attachment 131 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.
The original submitter of attachment 132 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.
The original submitter of attachment 133 is unknown.
   Reassigning to the person who moved it here: sgothel@jausoft.com.

</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>126</attachid>
            <date>2008-06-01 05:03:00 +0200</date>
            <delta_ts>2008-06-01 05:03:00 +0200</delta_ts>
            <desc>Log file obtained when the JVM crashed with JOGL 1.1.1 release candidate 5</desc>
            <filename>hs_err_pid10635.txt</filename>
            <type>text/plain</type>
            <size>18726</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">IwojIEFuIHVuZXhwZWN0ZWQgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgYnkgSmF2YSBSdW50aW1l
IEVudmlyb25tZW50OgojCiMgIFNJR1NFR1YgKDB4YikgYXQgcGM9MHhiN2U3MDNlZiwgcGlkPTEw
NjM1LCB0aWQ9MzAzOTY5NzgyNAojCiMgSmF2YSBWTTogSmF2YSBIb3RTcG90KFRNKSBDbGllbnQg
Vk0gKDEwLjAtYjE5IG1peGVkIG1vZGUsIHNoYXJpbmcgbGludXgteDg2KQojIFByb2JsZW1hdGlj
IGZyYW1lOgojIEMgIFtsaWJjLnNvLjYrMHg2MzNlZl0KIwojIElmIHlvdSB3b3VsZCBsaWtlIHRv
IHN1Ym1pdCBhIGJ1ZyByZXBvcnQsIHBsZWFzZSB2aXNpdDoKIyAgIGh0dHA6Ly9qYXZhLnN1bi5j
b20vd2ViYXBwcy9idWdyZXBvcnQvY3Jhc2guanNwCiMgVGhlIGNyYXNoIGhhcHBlbmVkIG91dHNp
ZGUgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIGluIG5hdGl2ZSBjb2RlLgojIFNlZSBwcm9ibGVt
YXRpYyBmcmFtZSBmb3Igd2hlcmUgdG8gcmVwb3J0IHRoZSBidWcuCiMKCi0tLS0tLS0tLS0tLS0t
LSAgVCBIIFIgRSBBIEQgIC0tLS0tLS0tLS0tLS0tLQoKQ3VycmVudCB0aHJlYWQgKDB4MDgyZjE4
MDApOiAgSmF2YVRocmVhZCAiQVdULUV2ZW50UXVldWUtMCIgW190aHJlYWRfaW5fbmF0aXZlLCBp
ZD0xMDY0Nywgc3RhY2soMHhiNTI5MTAwMCwweGI1MmUyMDAwKV0KCnNpZ2luZm86c2lfc2lnbm89
U0lHU0VHVjogc2lfZXJybm89MCwgc2lfY29kZT0xIChTRUdWX01BUEVSUiksIHNpX2FkZHI9MHgw
MDAwMDAwNwoKUmVnaXN0ZXJzOgpFQVg9MHhiN2YzOTE1OCwgRUJYPTB4YjdmMzdmZjQsIEVDWD0w
eGI3ZjM5MTU4LCBFRFg9MHgwMDAwMDAzMApFU1A9MHhiNTJlMGE0OCwgRUJQPTB4YjUyZTBhYTQs
IEVTST0weGZmZmZmZmZmLCBFREk9MHgwODQ4ZTE1MApFSVA9MHhiN2U3MDNlZiwgQ1IyPTB4MDAw
MDAwMDcsIEVGTEFHUz0weDAwMDEwMjg2CgpUb3Agb2YgU3RhY2s6IChzcD0weGI1MmUwYTQ4KQow
eGI1MmUwYTQ4OiAgIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwCjB4YjUyZTBh
NTg6ICAgMDAwMDAwMDAgYjdmMjhkMGEgMDAwMDAwMDAgYjdmMjhkMGEKMHhiNTJlMGE2ODogICBi
N2YzOTEyMCAwMDAwN2ZmOSBiN2YzOTEzOCBiN2YzOTE0NAoweGI1MmUwYTc4OiAgIGZmZmZmZmZm
IGI3ZjM5MTU4IDAwMDAwMDMwIDAwMDAwMDAwCjB4YjUyZTBhODg6ICAgMDAwMDAwMDAgMDAwMDAw
MDAgMDAwMDAwMDAgYjdlNzAzMWIKMHhiNTJlMGE5ODogICBiN2YzN2ZmNCBiN2YzOTEyMCAwODM1
OGUxMCBiNTJlMGI0YwoweGI1MmUwYWE4OiAgIGI3ZTcyNzI4IDAwMDAwMDAwIDAwMDAwMDAwIDAw
MDAwMDAwCjB4YjUyZTBhYjg6ICAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAg
CgpJbnN0cnVjdGlvbnM6IChwYz0weGI3ZTcwM2VmKQoweGI3ZTcwM2RmOiAgIDQ2IDBjIDg5IDE0
IDE2IDhiIDc1IGQ0IDg1IGY2IDBmIDg0IDk1IDAwIDAwIDAwCjB4YjdlNzAzZWY6ICAgOGIgNTYg
MDggOGIgNDYgMDQgODkgNTUgZDQgODkgYzIgODMgZTIgZmEgYTggMDEgCgpTdGFjazogWzB4YjUy
OTEwMDAsMHhiNTJlMjAwMF0sICBzcD0weGI1MmUwYTQ4LCAgZnJlZSBzcGFjZT0zMThrCk5hdGl2
ZSBmcmFtZXM6IChKPWNvbXBpbGVkIEphdmEgY29kZSwgaj1pbnRlcnByZXRlZCwgVnY9Vk0gY29k
ZSwgQz1uYXRpdmUgY29kZSkKQyAgW2xpYmMuc28uNisweDYzM2VmXQpDICBbbGliYy5zby42KzB4
NjU3MjhdCkMgIFtsaWJjLnNvLjYrMHg2NzA3NV0gIF9fbGliY19tYWxsb2MrMHg4NQpDICBbcjIw
MF9kcmkuc28rMHg5OTk4Yl0gIF9tZXNhX21hbGxvYysweDFiCnYgIH5CdWZmZXJCbG9iOjpJbnRl
cnByZXRlcgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJwcmV0ZXIKdiAgfkJ1ZmZlckJsb2I6OkludGVy
cHJldGVyCnYgIH5CdWZmZXJCbG9iOjpJbnRlcnByZXRlcgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJw
cmV0ZXIKdiAgfkJ1ZmZlckJsb2I6OkludGVycHJldGVyCnYgIH5CdWZmZXJCbG9iOjpJbnRlcnBy
ZXRlcgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJwcmV0ZXIKdiAgfkJ1ZmZlckJsb2I6OkludGVycHJl
dGVyCnYgIH5CdWZmZXJCbG9iOjpJbnRlcnByZXRlcgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJwcmV0
ZXIKdiAgfkJ1ZmZlckJsb2I6OkludGVycHJldGVyCnYgIH5CdWZmZXJCbG9iOjpJbnRlcnByZXRl
cgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJwcmV0ZXIKdiAgfkJ1ZmZlckJsb2I6OkludGVycHJldGVy
CnYgIH5CdWZmZXJCbG9iOjpJbnRlcnByZXRlcgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJwcmV0ZXIK
diAgfkJ1ZmZlckJsb2I6OkludGVycHJldGVyCnYgIH5CdWZmZXJCbG9iOjpJbnRlcnByZXRlcgp2
ICB+QnVmZmVyQmxvYjo6U3R1YlJvdXRpbmVzICgxKQpWICBbbGlianZtLnNvKzB4MjFjNDBkXQpW
ICBbbGlianZtLnNvKzB4MzEwMzc4XQpWICBbbGlianZtLnNvKzB4MjFiZDIwXQpWICBbbGlianZt
LnNvKzB4MjFiZGFkXQpWICBbbGlianZtLnNvKzB4MjhiZmI1XQpWICBbbGlianZtLnNvKzB4Mzkx
YmJkXQpWICBbbGlianZtLnNvKzB4MzExMDI5XQpDICBbbGlicHRocmVhZC5zby4wKzB4NTE5Ml0K
CkphdmEgZnJhbWVzOiAoSj1jb21waWxlZCBKYXZhIGNvZGUsIGo9aW50ZXJwcmV0ZWQsIFZ2PVZN
IGNvZGUpCnYgIH5CdWZmZXJCbG9iOjpJbnRlcnByZXRlcgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJw
cmV0ZXIKdiAgfkJ1ZmZlckJsb2I6OkludGVycHJldGVyCnYgIH5CdWZmZXJCbG9iOjpJbnRlcnBy
ZXRlcgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJwcmV0ZXIKdiAgfkJ1ZmZlckJsb2I6OkludGVycHJl
dGVyCnYgIH5CdWZmZXJCbG9iOjpJbnRlcnByZXRlcgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJwcmV0
ZXIKdiAgfkJ1ZmZlckJsb2I6OkludGVycHJldGVyCnYgIH5CdWZmZXJCbG9iOjpJbnRlcnByZXRl
cgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJwcmV0ZXIKdiAgfkJ1ZmZlckJsb2I6OkludGVycHJldGVy
CnYgIH5CdWZmZXJCbG9iOjpJbnRlcnByZXRlcgp2ICB+QnVmZmVyQmxvYjo6SW50ZXJwcmV0ZXIK
diAgfkJ1ZmZlckJsb2I6OkludGVycHJldGVyCnYgIH5CdWZmZXJCbG9iOjpJbnRlcnByZXRlcgp2
ICB+QnVmZmVyQmxvYjo6SW50ZXJwcmV0ZXIKdiAgfkJ1ZmZlckJsb2I6OkludGVycHJldGVyCnYg
IH5CdWZmZXJCbG9iOjpJbnRlcnByZXRlcgp2ICB+QnVmZmVyQmxvYjo6U3R1YlJvdXRpbmVzICgx
KQoKLS0tLS0tLS0tLS0tLS0tICBQIFIgTyBDIEUgUyBTICAtLS0tLS0tLS0tLS0tLS0KCkphdmEg
VGhyZWFkczogKCA9PiBjdXJyZW50IHRocmVhZCApCiAgMHgwODA1ODAwMCBKYXZhVGhyZWFkICJE
ZXN0cm95SmF2YVZNIiBbX3RocmVhZF9ibG9ja2VkLCBpZD0xMDYzNiwgc3RhY2soMHhiN2Q5NDAw
MCwweGI3ZGU1MDAwKV0KICAweDA4NWRhODAwIEphdmFUaHJlYWQgIlRocmVhZC0xIiBbX3RocmVh
ZF9pbl92bSwgaWQ9MTA2NDgsIHN0YWNrKDB4YjUyMDUwMDAsMHhiNTI1NjAwMCldCj0+MHgwODJm
MTgwMCBKYXZhVGhyZWFkICJBV1QtRXZlbnRRdWV1ZS0wIiBbX3RocmVhZF9pbl9uYXRpdmUsIGlk
PTEwNjQ3LCBzdGFjaygweGI1MjkxMDAwLDB4YjUyZTIwMDApXQogIDB4MDgyZTdjMDAgSmF2YVRo
cmVhZCAiQVdULVNodXRkb3duIiBbX3RocmVhZF9ibG9ja2VkLCBpZD0xMDY0Niwgc3RhY2soMHhi
NTM1ZTAwMCwweGI1M2FmMDAwKV0KICAweDA4MmU1ODAwIEphdmFUaHJlYWQgIkFXVC1YQVdUIiBk
YWVtb24gW190aHJlYWRfYmxvY2tlZCwgaWQ9MTA2NDUsIHN0YWNrKDB4YjUzYWYwMDAsMHhiNTQw
MDAwMCldCiAgMHgwODEyN2MwMCBKYXZhVGhyZWFkICJKYXZhMkQgRGlzcG9zZXIiIGRhZW1vbiBb
X3RocmVhZF9ibG9ja2VkLCBpZD0xMDY0NCwgc3RhY2soMHhiNTQzNjAwMCwweGI1NDg3MDAwKV0K
ICAweDA4MDk1YzAwIEphdmFUaHJlYWQgIkxvdyBNZW1vcnkgRGV0ZWN0b3IiIGRhZW1vbiBbX3Ro
cmVhZF9ibG9ja2VkLCBpZD0xMDY0Miwgc3RhY2soMHhiNTk4YjAwMCwweGI1OWRjMDAwKV0KICAw
eDA4MDhiNDAwIEphdmFUaHJlYWQgIkNvbXBpbGVyVGhyZWFkMCIgZGFlbW9uIFtfdGhyZWFkX2Js
b2NrZWQsIGlkPTEwNjQxLCBzdGFjaygweGI1OWRjMDAwLDB4YjVhNWQwMDApXQogIDB4MDgwODlj
MDAgSmF2YVRocmVhZCAiU2lnbmFsIERpc3BhdGNoZXIiIGRhZW1vbiBbX3RocmVhZF9ibG9ja2Vk
LCBpZD0xMDY0MCwgc3RhY2soMHhiNWE1ZDAwMCwweGI1YWFlMDAwKV0KICAweDA4MDgxMDAwIEph
dmFUaHJlYWQgIkZpbmFsaXplciIgZGFlbW9uIFtfdGhyZWFkX2Jsb2NrZWQsIGlkPTEwNjM5LCBz
dGFjaygweGI1YWY5MDAwLDB4YjViNGEwMDApXQogIDB4MDgwN2ZjMDAgSmF2YVRocmVhZCAiUmVm
ZXJlbmNlIEhhbmRsZXIiIGRhZW1vbiBbX3RocmVhZF9ibG9ja2VkLCBpZD0xMDYzOCwgc3RhY2so
MHhiNWI0YTAwMCwweGI1YjliMDAwKV0KCk90aGVyIFRocmVhZHM6CiAgMHgwODA3ZTgwMCBWTVRo
cmVhZCBbc3RhY2s6IDB4YjViOWIwMDAsMHhiNWMxYzAwMF0gW2lkPTEwNjM3XQogIDB4MDgwOTc0
MDAgV2F0Y2hlclRocmVhZCBbc3RhY2s6IDB4YjU5MGEwMDAsMHhiNTk4YjAwMF0gW2lkPTEwNjQz
XQoKVk0gc3RhdGU6bm90IGF0IHNhZmVwb2ludCAobm9ybWFsIGV4ZWN1dGlvbikKClZNIE11dGV4
L01vbml0b3IgY3VycmVudGx5IG93bmVkIGJ5IGEgdGhyZWFkOiBOb25lCgpIZWFwCiBkZWYgbmV3
IGdlbmVyYXRpb24gICB0b3RhbCA5NjBLLCB1c2VkIDg5MksgWzB4OGMwYTAwMDAsIDB4OGMxYTAw
MDAsIDB4OGM1ODAwMDApCiAgZWRlbiBzcGFjZSA4OTZLLCAgOTIlIHVzZWQgWzB4OGMwYTAwMDAs
IDB4OGMxNmYzMzgsIDB4OGMxODAwMDApCiAgZnJvbSBzcGFjZSA2NEssIDEwMCUgdXNlZCBbMHg4
YzE4MDAwMCwgMHg4YzE5MDAwMCwgMHg4YzE5MDAwMCkKICB0byAgIHNwYWNlIDY0SywgICAwJSB1
c2VkIFsweDhjMTkwMDAwLCAweDhjMTkwMDAwLCAweDhjMWEwMDAwKQogdGVudXJlZCBnZW5lcmF0
aW9uICAgdG90YWwgNDA5NkssIHVzZWQgNjExSyBbMHg4YzU4MDAwMCwgMHg4Yzk4MDAwMCwgMHg5
MDBhMDAwMCkKICAgdGhlIHNwYWNlIDQwOTZLLCAgMTQlIHVzZWQgWzB4OGM1ODAwMDAsIDB4OGM2
MThjNzAsIDB4OGM2MThlMDAsIDB4OGM5ODAwMDApCiBjb21wYWN0aW5nIHBlcm0gZ2VuICB0b3Rh
bCAxMjI4OEssIHVzZWQgMjgzNEsgWzB4OTAwYTAwMDAsIDB4OTBjYTAwMDAsIDB4OTQwYTAwMDAp
CiAgIHRoZSBzcGFjZSAxMjI4OEssICAyMyUgdXNlZCBbMHg5MDBhMDAwMCwgMHg5MDM2NGI3OCwg
MHg5MDM2NGMwMCwgMHg5MGNhMDAwMCkKICAgIHJvIHNwYWNlIDgxOTJLLCAgNzMlIHVzZWQgWzB4
OTQwYTAwMDAsIDB4OTQ2ODMzMTAsIDB4OTQ2ODM0MDAsIDB4OTQ4YTAwMDApCiAgICBydyBzcGFj
ZSAxMjI4OEssICA1OCUgdXNlZCBbMHg5NDhhMDAwMCwgMHg5NGY5ODU3MCwgMHg5NGY5ODYwMCwg
MHg5NTRhMDAwMCkKCkR5bmFtaWMgbGlicmFyaWVzOgowNjAwMDAwMC0wNjQxYTAwMCByLXhwIDAw
MDAwMDAwIDAzOjAxIDM3NDQ3MyAgICAgL3Vzci9qYXZhL2pkazEuNi4wXzA0L2pyZS9saWIvaTM4
Ni9jbGllbnQvbGlianZtLnNvCjA2NDFhMDAwLTA2NDM0MDAwIHJ3eHAgMDA0MWEwMDAgMDM6MDEg
Mzc0NDczICAgICAvdXNyL2phdmEvamRrMS42LjBfMDQvanJlL2xpYi9pMzg2L2NsaWVudC9saWJq
dm0uc28KMDY0MzQwMDAtMDY4NTQwMDAgcnd4cCAwNjQzNDAwMCAwMDowMCAwIAowODA0ODAwMC0w
ODA1MjAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDYzNDE0MiAgICAgL3Vzci9qYXZhL2pkazEuNi4w
XzA0L2Jpbi9qYXZhCjA4MDUyMDAwLTA4MDUzMDAwIHJ3eHAgMDAwMDkwMDAgMDM6MDEgNjM0MTQy
ICAgICAvdXNyL2phdmEvamRrMS42LjBfMDQvYmluL2phdmEKMDgwNTMwMDAtMDhhMGUwMDAgcnd4
cCAwODA1MzAwMCAwMDowMCAwICAgICAgICAgIFtoZWFwXQo4YzBhMDAwMC04YzFhMDAwMCByd3hw
IDhjMGEwMDAwIDAwOjAwIDAgCjhjMWEwMDAwLThjNTgwMDAwIHJ3eHAgOGMxYTAwMDAgMDA6MDAg
MCAKOGM1ODAwMDAtOGM5ODAwMDAgcnd4cCA4YzU4MDAwMCAwMDowMCAwIAo4Yzk4MDAwMC05MDBh
MDAwMCByd3hwIDhjOTgwMDAwIDAwOjAwIDAgCjkwMGEwMDAwLTkwY2EwMDAwIHJ3eHAgOTAwYTAw
MDAgMDA6MDAgMCAKOTBjYTAwMDAtOTQwYTAwMDAgcnd4cCA5MGNhMDAwMCAwMDowMCAwIAo5NDBh
MDAwMC05NDY4NDAwMCByLXhzIDAwMDAxMDAwIDAzOjAxIDg3ODgzOSAgICAgL3Vzci9qYXZhL2pk
azEuNi4wXzA0L2pyZS9saWIvaTM4Ni9jbGllbnQvY2xhc3Nlcy5qc2EKOTQ2ODQwMDAtOTQ4YTAw
MDAgcnd4cCA5NDY4NDAwMCAwMDowMCAwIAo5NDhhMDAwMC05NGY5OTAwMCByd3hwIDAwNWU1MDAw
IDAzOjAxIDg3ODgzOSAgICAgL3Vzci9qYXZhL2pkazEuNi4wXzA0L2pyZS9saWIvaTM4Ni9jbGll
bnQvY2xhc3Nlcy5qc2EKOTRmOTkwMDAtOTU0YTAwMDAgcnd4cCA5NGY5OTAwMCAwMDowMCAwIAo5
NTRhMDAwMC05NTU3OTAwMCByd3hwIDAwY2RlMDAwIDAzOjAxIDg3ODgzOSAgICAgL3Vzci9qYXZh
L2pkazEuNi4wXzA0L2pyZS9saWIvaTM4Ni9jbGllbnQvY2xhc3Nlcy5qc2EKOTU1NzkwMDAtOTU4
YTAwMDAgcnd4cCA5NTU3OTAwMCAwMDowMCAwIAo5NThhMDAwMC05NThhNDAwMCByLXhzIDAwZGI3
MDAwIDAzOjAxIDg3ODgzOSAgICAgL3Vzci9qYXZhL2pkazEuNi4wXzA0L2pyZS9saWIvaTM4Ni9j
bGllbnQvY2xhc3Nlcy5qc2EKOTU4YTQwMDAtOTVjYTAwMDAgcnd4cCA5NThhNDAwMCAwMDowMCAw
IAphM2NmMDAwMC1hM2Q0NDAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDM3NDUwOSAgICAgL3Vzci9q
YXZhL2pkazEuNi4wXzA0L2pyZS9saWIvaTM4Ni9saWJjbW0uc28KYTNkNDQwMDAtYTNkNDcwMDAg
cnd4cCAwMDA1NDAwMCAwMzowMSAzNzQ1MDkgICAgIC91c3IvamF2YS9qZGsxLjYuMF8wNC9qcmUv
bGliL2kzODYvbGliY21tLnNvCmEzZDQ3MDAwLWEzZmQ2MDAwIHJ3eHAgYTNkNDcwMDAgMDA6MDAg
MCAKYTNmZDYwMDAtYTQ0YjYwMDAgcnd4cyBlMDMwMjAwMCAwMDowZCA5OTUyICAgICAgIC9kZXYv
ZHJpL2NhcmQwCmE0NGI2MDAwLWE0NmI2MDAwIHJ3eHMgZTAxMDIwMDAgMDA6MGQgOTk1MiAgICAg
ICAvZGV2L2RyaS9jYXJkMAphNDZiNjAwMC1hYzZiNjAwMCByd3hzIGQwMDAwMDAwIDAwOjBkIDk5
NTIgICAgICAgL2Rldi9kcmkvY2FyZDAKYWM2YjYwMDAtYWNiOTYwMDAgcnd4cyBlMDMwMjAwMCAw
MDowZCA5OTUyICAgICAgIC9kZXYvZHJpL2NhcmQwCmFjYjk2MDAwLWFjZDk2MDAwIHJ3eHMgZTAx
MDIwMDAgMDA6MGQgOTk1MiAgICAgICAvZGV2L2RyaS9jYXJkMAphY2Q5NjAwMC1iNGQ5NjAwMCBy
d3hzIGQwMDAwMDAwIDAwOjBkIDk5NTIgICAgICAgL2Rldi9kcmkvY2FyZDAKYjRkOTYwMDAtYjRm
ZTgwMDAgci14cCAwMDAwMDAwMCAwMzowMSAzNjEzNCAgICAgIC91c3IvbGliL2RyaS9yMjAwX2Ry
aS5zbwpiNGZlODAwMC1iNGZmZTAwMCByd3hwIDAwMjUxMDAwIDAzOjAxIDM2MTM0ICAgICAgL3Vz
ci9saWIvZHJpL3IyMDBfZHJpLnNvCmI0ZmZlMDAwLWI1MDI0MDAwIHJ3eHAgYjRmZmUwMDAgMDA6
MDAgMCAKYjUwMjQwMDAtYjUwZmYwMDAgci14cCAwMDAwMDAwMCAwMzowMSAzNzU0MzIgICAgIC91
c3IvamF2YS9qZGsxLjYuMF8wNC9qcmUvbGliL2kzODYvbGliam9nbC5zbwpiNTBmZjAwMC1iNTEw
MDAwMCByd3hwIDAwMGRhMDAwIDAzOjAxIDM3NTQzMiAgICAgL3Vzci9qYXZhL2pkazEuNi4wXzA0
L2pyZS9saWIvaTM4Ni9saWJqb2dsLnNvCmI1MTAwMDAwLWI1MTI1MDAwIHJ3eHAgYjUxMDAwMDAg
MDA6MDAgMCAKYjUxMjUwMDAtYjUyMDAwMDAgLS0tcCBiNTEyNTAwMCAwMDowMCAwIApiNTIwNTAw
MC1iNTIwODAwMCAtLS1wIGI1MjA1MDAwIDAwOjAwIDAgCmI1MjA4MDAwLWI1MjU2MDAwIHJ3eHAg
YjUyMDgwMDAgMDA6MDAgMCAKYjUyNTYwMDAtYjUyNzQwMDAgci14cCAwMDAwMDAwMCAwMzowMSA5
NDU2MjcgICAgIC91c3IvbGliL2xpYmV4cGF0LnNvLjAuNS4wCmI1Mjc0MDAwLWI1Mjc2MDAwIHJ3
eHAgMDAwMWUwMDAgMDM6MDEgOTQ1NjI3ICAgICAvdXNyL2xpYi9saWJleHBhdC5zby4wLjUuMApi
NTI4MTAwMC1iNTI5MTAwMCByLXhzIGU1MDAwMDAwIDAwOjBkIDk5NTIgICAgICAgL2Rldi9kcmkv
Y2FyZDAKYjUyOTEwMDAtYjUyOTQwMDAgLS0tcCBiNTI5MTAwMCAwMDowMCAwIApiNTI5NDAwMC1i
NTJlMjAwMCByd3hwIGI1Mjk0MDAwIDAwOjAwIDAgCmI1MmUyMDAwLWI1MmVjMDAwIHIteHAgMDAw
MDAwMDAgMDM6MDEgOTQ2NjgzICAgICAvdXNyL2xpYi9saWJkcm0uc28uMi4zLjAKYjUyZWMwMDAt
YjUyZWQwMDAgcnd4cCAwMDAwOTAwMCAwMzowMSA5NDY2ODMgICAgIC91c3IvbGliL2xpYmRybS5z
by4yLjMuMApiNTJlZDAwMC1iNTJmMTAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDk0NjY5MSAgICAg
L3Vzci9saWIvbGliWHhmODZ2bS5zby4xLjAuMApiNTJmMTAwMC1iNTJmMjAwMCByd3hwIDAwMDAz
MDAwIDAzOjAxIDk0NjY5MSAgICAgL3Vzci9saWIvbGliWHhmODZ2bS5zby4xLjAuMApiNTJmMjAw
MC1iNTM1NzAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDk0NjkzOCAgICAgL3Vzci9saWIvbGliR0wu
c28uMS4yCmI1MzU3MDAwLWI1MzVkMDAwIHJ3eHAgMDAwNjQwMDAgMDM6MDEgOTQ2OTM4ICAgICAv
dXNyL2xpYi9saWJHTC5zby4xLjIKYjUzNWQwMDAtYjUzNWUwMDAgcnd4cCBiNTM1ZDAwMCAwMDow
MCAwIApiNTM1ZTAwMC1iNTM2MTAwMCAtLS1wIGI1MzVlMDAwIDAwOjAwIDAgCmI1MzYxMDAwLWI1
M2FmMDAwIHJ3eHAgYjUzNjEwMDAgMDA6MDAgMCAKYjUzYWYwMDAtYjUzYjIwMDAgLS0tcCBiNTNh
ZjAwMCAwMDowMCAwIApiNTNiMjAwMC1iNTQwMDAwMCByd3hwIGI1M2IyMDAwIDAwOjAwIDAgCmI1
NDAwMDAwLWI1NDA4MDAwIHIteHAgMDAwMDAwMDAgMDM6MDEgOTQ1NTE1ICAgICAvdXNyL2xpYi9s
aWJYcmVuZGVyLnNvLjEuMy4wCmI1NDA4MDAwLWI1NDA5MDAwIHJ3eHAgMDAwMDcwMDAgMDM6MDEg
OTQ1NTE1ICAgICAvdXNyL2xpYi9saWJYcmVuZGVyLnNvLjEuMy4wCmI1NDA5MDAwLWI1NDEyMDAw
IHIteHAgMDAwMDAwMDAgMDM6MDEgOTQ1NjE0ICAgICAvdXNyL2xpYi9saWJYY3Vyc29yLnNvLjEu
MC4yCmI1NDEyMDAwLWI1NDEzMDAwIHJ3eHAgMDAwMDgwMDAgMDM6MDEgOTQ1NjE0ICAgICAvdXNy
L2xpYi9saWJYY3Vyc29yLnNvLjEuMC4yCmI1NDE2MDAwLWI1NDE3MDAwIHIteHMgZTAxMDEwMDAg
MDA6MGQgOTk1MiAgICAgICAvZGV2L2RyaS9jYXJkMApiNTQxNzAwMC1iNTQxOTAwMCByd3hzIGY4
ODRlMDAwIDAwOjBkIDk5NTIgICAgICAgL2Rldi9kcmkvY2FyZDAKYjU0MTkwMDAtYjU0MWEwMDAg
ci14cyBlMDEwMTAwMCAwMDowZCA5OTUyICAgICAgIC9kZXYvZHJpL2NhcmQwCmI1NDFhMDAwLWI1
NDJhMDAwIHIteHMgZTUwMDAwMDAgMDA6MGQgOTk1MiAgICAgICAvZGV2L2RyaS9jYXJkMApiNTQy
YTAwMC1iNTQyYjAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDM3NTQzMCAgICAgL3Vzci9qYXZhL2pk
azEuNi4wXzA0L2pyZS9saWIvaTM4Ni9saWJqb2dsX2F3dC5zbwpiNTQyYjAwMC1iNTQyYzAwMCBy
d3hwIDAwMDAxMDAwIDAzOjAxIDM3NTQzMCAgICAgL3Vzci9qYXZhL2pkazEuNi4wXzA0L2pyZS9s
aWIvaTM4Ni9saWJqb2dsX2F3dC5zbwpiNTQyYzAwMC1iNTQyZDAwMCByLXhwIDAwMDAwMDAwIDAz
OjAxIDM3NDUxMyAgICAgL3Vzci9qYXZhL2pkazEuNi4wXzA0L2pyZS9saWIvaTM4Ni9saWJqYXd0
LnNvCmI1NDJkMDAwLWI1NDJlMDAwIHJ3eHAgMDAwMDAwMDAgMDM6MDEgMzc0NTEzICAgICAvdXNy
L2phdmEvamRrMS42LjBfMDQvanJlL2xpYi9pMzg2L2xpYmphd3Quc28KYjU0MmUwMDAtYjU0MzUw
MDAgci14cCAwMDAwMDAwMCAwMzowMSAzNzQ0ODkgICAgIC91c3IvamF2YS9qZGsxLjYuMF8wNC9q
cmUvbGliL2kzODYvbGlibmlvLnNvCmI1NDM1MDAwLWI1NDM2MDAwIHJ3eHAgMDAwMDYwMDAgMDM6
MDEgMzc0NDg5ICAgICAvdXNyL2phdmEvamRrMS42LjBfMDQvanJlL2xpYi9pMzg2L2xpYm5pby5z
bwpiNTQzNjAwMC1iNTQzOTAwMCAtLS1wIGI1NDM2MDAwIDAwOjAwIDAgCmI1NDM5MDAwLWI1NDg3
MDAwIHJ3eHAgYjU0MzkwMDAgMDA6MDAgMCAKYjU0ODcwMDAtYjU1MDUwMDAgci14cCAwMDAwMDAw
MCAwMzowMSAzNzQ1MDcgICAgIC91c3IvamF2YS9qZGsxLjYuMF8wNC9qcmUvbGliL2kzODYvbGli
Zm9udG1hbmFnZXIuc28KYjU1MDUwMDAtYjU1MGYwMDAgcnd4cCAwMDA3ZTAwMCAwMzowMSAzNzQ1
MDcgICAgIC91c3IvamF2YS9qZGsxLjYuMF8wNC9qcmUvbGliL2kzODYvbGliZm9udG1hbmFnZXIu
c28KYjU1MGYwMDAtYjU1MTQwMDAgcnd4cCBiNTUwZjAwMCAwMDowMCAwIApiNTUxNDAwMC1iNTUx
OTAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDk0NTQyOSAgICAgL3Vzci9saWIvbGliWGRtY3Auc28u
Ni4wLjAKYjU1MTkwMDAtYjU1MWEwMDAgcnd4cCAwMDAwNDAwMCAwMzowMSA5NDU0MjkgICAgIC91
c3IvbGliL2xpYlhkbWNwLnNvLjYuMC4wCmI1NTFhMDAwLWI1NTFjMDAwIHIteHAgMDAwMDAwMDAg
MDM6MDEgOTQ1NDI3ICAgICAvdXNyL2xpYi9saWJYYXUuc28uNi4wLjAKYjU1MWMwMDAtYjU1MWQw
MDAgcnd4cCAwMDAwMTAwMCAwMzowMSA5NDU0MjcgICAgIC91c3IvbGliL2xpYlhhdS5zby42LjAu
MApiNTUxZDAwMC1iNTUyNDAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDk0NTY1NiAgICAgL3Vzci9s
aWIvbGliWGkuc28uNi4wLjAKYjU1MjQwMDAtYjU1MjUwMDAgcnd4cCAwMDAwNzAwMCAwMzowMSA5
NDU2NTYgICAgIC91c3IvbGliL2xpYlhpLnNvLjYuMC4wCmI1NTI1MDAwLWI1NTJhMDAwIHIteHAg
MDAwMDAwMDAgMDM6MDEgOTQ3ODg1ICAgICAvdXNyL2xpYi9saWJYdHN0LnNvLjYuMS4wCmI1NTJh
MDAwLWI1NTJiMDAwIHJ3eHAgMDAwMDQwMDAgMDM6MDEgOTQ3ODg1ICAgICAvdXNyL2xpYi9saWJY
dHN0LnNvLjYuMS4wCmI1NTJiMDAwLWI1NjJhMDAwIHIteHAgMDAwMDAwMDAgMDM6MDEgOTQ1NDMw
ICAgICAvdXNyL2xpYi9saWJYMTEuc28uNi4yLjAKYjU2MmEwMDAtYjU2MmUwMDAgcnd4cCAwMDBm
ZjAwMCAwMzowMSA5NDU0MzAgICAgIC91c3IvbGliL2xpYlgxMS5zby42LjIuMApiNTYyZTAwMC1i
NTYzYzAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDk0NTQ5MCAgICAgL3Vzci9saWIvbGliWGV4dC5z
by42LjQuMApiNTYzYzAwMC1iNTYzZDAwMCByd3hwIDAwMDBlMDAwIDAzOjAxIDk0NTQ5MCAgICAg
L3Vzci9saWIvbGliWGV4dC5zby42LjQuMApiNTYzZDAwMC1iNTYzZjAwMCByd3hzIGY4ODRlMDAw
IDAwOjBkIDk5NTIgICAgICAgL2Rldi9kcmkvY2FyZDAKYjU2M2YwMDAtYjU2NDMwMDAgci14cCAw
MDAwMDAwMCAwMzowMSA5NDU1OTYgICAgIC91c3IvbGliL2xpYlhmaXhlcy5zby4zLjEuMApiNTY0
MzAwMC1iNTY0NDAwMCByd3hwIDAwMDAzMDAwIDAzOjAxIDk0NTU5NiAgICAgL3Vzci9saWIvbGli
WGZpeGVzLnNvLjMuMS4wCmI1NjQ0MDAwLWI1NjU3MDAwIHIteHAgMDAwMDAwMDAgMDM6MDEgMzc0
NDg4ICAgICAvdXNyL2phdmEvamRrMS42LjBfMDQvanJlL2xpYi9pMzg2L2xpYm5ldC5zbwpiNTY1
NzAwMC1iNTY1ODAwMCByd3hwIDAwMDEzMDAwIDAzOjAxIDM3NDQ4OCAgICAgL3Vzci9qYXZhL2pk
azEuNi4wXzA0L2pyZS9saWIvaTM4Ni9saWJuZXQuc28KYjU2NTgwMDAtYjU2OTkwMDAgci14cCAw
MDAwMDAwMCAwMzowMSAzNzQ1MDIgICAgIC91c3IvamF2YS9qZGsxLjYuMF8wNC9qcmUvbGliL2kz
ODYveGF3dC9saWJtYXd0LnNvCmI1Njk5MDAwLWI1NjliMDAwIHJ3eHAgMDAwNDEwMDAgMDM6MDEg
Mzc0NTAyICAgICAvdXNyL2phdmEvamRrMS42LjBfMDQvanJlL2xpYi9pMzg2L3hhd3QvbGlibWF3
dC5zbwpiNTY5YjAwMC1iNTY5YzAwMCByd3hwIGI1NjliMDAwIDAwOjAwIDAgCmI1NjljMDAwLWI1
NzE3MDAwIHIteHAgMDAwMDAwMDAgMDM6MDEgMzc0NDk5ICAgICAvdXNyL2phdmEvamRrMS42LjBf
MDQvanJlL2xpYi9pMzg2L2xpYmF3dC5zbwpiNTcxNzAwMC1iNTcxZTAwMCByd3hwIDAwMDdiMDAw
IDAzOjAxIDM3NDQ5OSAgICAgL3Vzci9qYXZhL2pkazEuNi4wXzA0L2pyZS9saWIvaTM4Ni9saWJh
d3Quc28KYjU3MWUwMDAtYjU3NzQwMDAgcnd4cCBiNTcxZTAwMCAwMDowMCAwIApiNTc3NDAwMC1i
NThmZTAwMCByLXhzIDAyZGUxMDAwIDAzOjAxIDM3NDQzOCAgICAgL3Vzci9qYXZhL2pkazEuNi4w
XzA0L2pyZS9saWIvcnQuamFyCmI1OGZlMDAwLWI1OTBhMDAwIHIteHMgMDAxMDcwMDAgMDM6MDEg
Mzc1NDQ4ICAgICAvdXNyL2phdmEvamRrMS42LjBfMDQvanJlL2xpYi9leHQvam9nbC5qYXIKYjU5
MGEwMDAtYjU5MGIwMDAgLS0tcCBiNTkwYTAwMCAwMDowMCAwIApiNTkwYjAwMC1iNTk4YjAwMCBy
d3hwIGI1OTBiMDAwIDAwOjAwIDAgCmI1OThiMDAwLWI1OThlMDAwIC0tLXAgYjU5OGIwMDAgMDA6
MDAgMCAKYjU5OGUwMDAtYjU5ZGMwMDAgcnd4cCBiNTk4ZTAwMCAwMDowMCAwIApiNTlkYzAwMC1i
NTlkZjAwMCAtLS1wIGI1OWRjMDAwIDAwOjAwIDAgCmI1OWRmMDAwLWI1YTVkMDAwIHJ3eHAgYjU5
ZGYwMDAgMDA6MDAgMCAKYjVhNWQwMDAtYjVhNjAwMDAgLS0tcCBiNWE1ZDAwMCAwMDowMCAwIApi
NWE2MDAwMC1iNWFhZTAwMCByd3hwIGI1YTYwMDAwIDAwOjAwIDAgCmI1YWFlMDAwLWI1YWI1MDAw
IHIteHMgMDAwMDAwMDAgMDM6MDEgOTQzMjM3ICAgICAvdXNyL2xpYi9nY29udi9nY29udi1tb2R1
bGVzLmNhY2hlCmI1YWI1MDAwLWI1YWY5MDAwIHIteHAgMDAwMDAwMDAgMDM6MDEgOTYwMTM2ICAg
ICAvdXNyL3NoYXJlL2xvY2FsZS9mcl9CRS5VVEYtOC9MQ19DVFlQRQpiNWFmOTAwMC1iNWFmYzAw
MCAtLS1wIGI1YWY5MDAwIDAwOjAwIDAgCmI1YWZjMDAwLWI1YjRhMDAwIHJ3eHAgYjVhZmMwMDAg
MDA6MDAgMCAKYjViNGEwMDAtYjViNGQwMDAgLS0tcCBiNWI0YTAwMCAwMDowMCAwIApiNWI0ZDAw
MC1iNWI5YjAwMCByd3hwIGI1YjRkMDAwIDAwOjAwIDAgCmI1YjliMDAwLWI1YjljMDAwIC0tLXAg
YjViOWIwMDAgMDA6MDAgMCAKYjViOWMwMDAtYjVjMjMwMDAgcnd4cCBiNWI5YzAwMCAwMDowMCAw
IApiNWMyMzAwMC1iNWMzZDAwMCByd3hwIGI1YzIzMDAwIDAwOjAwIDAgCmI1YzNkMDAwLWI1YzQw
MDAwIHJ3eHAgYjVjM2QwMDAgMDA6MDAgMCAKYjVjNDAwMDAtYjVjNWIwMDAgcnd4cCBiNWM0MDAw
MCAwMDowMCAwIApiNWM1YjAwMC1iNWM1YzAwMCByd3hwIGI1YzViMDAwIDAwOjAwIDAgCmI1YzVj
MDAwLWI1YzVkMDAwIHJ3eHAgYjVjNWMwMDAgMDA6MDAgMCAKYjVjNWQwMDAtYjVjNjAwMDAgcnd4
cCBiNWM1ZDAwMCAwMDowMCAwIApiNWM2MDAwMC1iNWM3YjAwMCByd3hwIGI1YzYwMDAwIDAwOjAw
IDAgCmI1YzdiMDAwLWI1YzgxMDAwIHJ3eHAgYjVjN2IwMDAgMDA6MDAgMCAKYjVjODEwMDAtYjVj
OWIwMDAgcnd4cCBiNWM4MTAwMCAwMDowMCAwIApiNWM5YjAwMC1iNWNhYTAwMCByd3hwIGI1Yzli
MDAwIDAwOjAwIDAgCmI1Y2FhMDAwLWI1ZDI2MDAwIHJ3eHAgYjVjYWEwMDAgMDA6MDAgMCAKYjVk
MjYwMDAtYjVlMDYwMDAgcnd4cCBiNWQyNjAwMCAwMDowMCAwIApiNWUwNjAwMC1iN2QyNjAwMCBy
d3hwIGI1ZTA2MDAwIDAwOjAwIDAgCmI3ZDI2MDAwLWI3ZDM1MDAwIHIteHAgMDAwMDAwMDAgMDM6
MDEgMzc0NDg0ICAgICAvdXNyL2phdmEvamRrMS42LjBfMDQvanJlL2xpYi9pMzg2L2xpYnppcC5z
bwpiN2QzNTAwMC1iN2QzNzAwMCByd3hwIDAwMDBlMDAwIDAzOjAxIDM3NDQ4NCAgICAgL3Vzci9q
YXZhL2pkazEuNi4wXzA0L2pyZS9saWIvaTM4Ni9saWJ6aXAuc28KYjdkMzcwMDAtYjdkNWEwMDAg
ci14cCAwMDAwMDAwMCAwMzowMSAzNzQ0ODAgICAgIC91c3IvamF2YS9qZGsxLjYuMF8wNC9qcmUv
bGliL2kzODYvbGliamF2YS5zbwpiN2Q1YTAwMC1iN2Q1YzAwMCByd3hwIDAwMDIzMDAwIDAzOjAx
IDM3NDQ4MCAgICAgL3Vzci9qYXZhL2pkazEuNi4wXzA0L2pyZS9saWIvaTM4Ni9saWJqYXZhLnNv
CmI3ZDVjMDAwLWI3ZDZjMDAwIHIteHAgMDAwMDAwMDAgMDM6MDEgODQ1MzQzICAgICAvbGliL2xp
Ym5zbC0yLjQuc28KYjdkNmMwMDAtYjdkNmUwMDAgcnd4cCAwMDAxMDAwMCAwMzowMSA4NDUzNDMg
ICAgIC9saWIvbGlibnNsLTIuNC5zbwpiN2Q2ZTAwMC1iN2Q3MDAwMCByd3hwIGI3ZDZlMDAwIDAw
OjAwIDAgCmI3ZDcwMDAwLWI3ZDcxMDAwIHIteHAgMDAwMDAwMDAgMDM6MDEgMzc1NDI5ICAgICAv
dXNyL2phdmEvamRrMS42LjBfMDQvanJlL2xpYi9pMzg2L2xpYmdsdWVnZW4tcnQuc28KYjdkNzEw
MDAtYjdkNzIwMDAgcnd4cCAwMDAwMDAwMCAwMzowMSAzNzU0MjkgICAgIC91c3IvamF2YS9qZGsx
LjYuMF8wNC9qcmUvbGliL2kzODYvbGliZ2x1ZWdlbi1ydC5zbwpiN2Q3MjAwMC1iN2Q3MzAwMCBy
LXhzIDAwMDA0MDAwIDAzOjAxIDM3NTQ0NSAgICAgL3Vzci9qYXZhL2pkazEuNi4wXzA0L2pyZS9s
aWIvZXh0L2dsdWVnZW4tcnQuamFyCmI3ZDczMDAwLWI3ZDdmMDAwIHJ3eHAgYjdkNzMwMDAgMDA6
MDAgMCAKYjdkN2YwMDAtYjdkOGEwMDAgci14cCAwMDAwMDAwMCAwMzowMSAzNzQ0NzkgICAgIC91
c3IvamF2YS9qZGsxLjYuMF8wNC9qcmUvbGliL2kzODYvbGlidmVyaWZ5LnNvCmI3ZDhhMDAwLWI3
ZDhiMDAwIHJ3eHAgMDAwMGIwMDAgMDM6MDEgMzc0NDc5ICAgICAvdXNyL2phdmEvamRrMS42LjBf
MDQvanJlL2xpYi9pMzg2L2xpYnZlcmlmeS5zbwpiN2Q4YjAwMC1iN2Q5MjAwMCByLXhwIDAwMDAw
MDAwIDAzOjAxIDg0NTMyNCAgICAgL2xpYi9pNjg2L2xpYnJ0LTIuNC5zbwpiN2Q5MjAwMC1iN2Q5
NDAwMCByd3hwIDAwMDA2MDAwIDAzOjAxIDg0NTMyNCAgICAgL2xpYi9pNjg2L2xpYnJ0LTIuNC5z
bwpiN2Q5NDAwMC1iN2Q5NzAwMCAtLS1wIGI3ZDk0MDAwIDAwOjAwIDAgCmI3ZDk3MDAwLWI3ZGU1
MDAwIHJ3eHAgYjdkOTcwMDAgMDA6MDAgMCAKYjdkZTUwMDAtYjdlMGEwMDAgci14cCAwMDAwMDAw
MCAwMzowMSA4NDUzMjAgICAgIC9saWIvaTY4Ni9saWJtLTIuNC5zbwpiN2UwYTAwMC1iN2UwYzAw
MCByd3hwIDAwMDI0MDAwIDAzOjAxIDg0NTMyMCAgICAgL2xpYi9pNjg2L2xpYm0tMi40LnNvCmI3
ZTBjMDAwLWI3ZTBkMDAwIHJ3eHAgYjdlMGMwMDAgMDA6MDAgMCAKYjdlMGQwMDAtYjdmMzYwMDAg
ci14cCAwMDAwMDAwMCAwMzowMSA4NDUzMTggICAgIC9saWIvaTY4Ni9saWJjLTIuNC5zbwpiN2Yz
NjAwMC1iN2YzNzAwMCByLXhwIDAwMTI5MDAwIDAzOjAxIDg0NTMxOCAgICAgL2xpYi9pNjg2L2xp
YmMtMi40LnNvCmI3ZjM3MDAwLWI3ZjM5MDAwIHJ3eHAgMDAxMmEwMDAgMDM6MDEgODQ1MzE4ICAg
ICAvbGliL2k2ODYvbGliYy0yLjQuc28KYjdmMzkwMDAtYjdmM2MwMDAgcnd4cCBiN2YzOTAwMCAw
MDowMCAwIApiN2YzYzAwMC1iN2YzZTAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDg0NTMzOSAgICAg
L2xpYi9saWJkbC0yLjQuc28KYjdmM2UwMDAtYjdmNDAwMDAgcnd4cCAwMDAwMTAwMCAwMzowMSA4
NDUzMzkgICAgIC9saWIvbGliZGwtMi40LnNvCmI3ZjQwMDAwLWI3ZjQ3MDAwIHIteHAgMDAwMDAw
MDAgMDM6MDEgMzc0NDgyICAgICAvdXNyL2phdmEvamRrMS42LjBfMDQvanJlL2xpYi9pMzg2L2ps
aS9saWJqbGkuc28KYjdmNDcwMDAtYjdmNDkwMDAgcnd4cCAwMDAwNjAwMCAwMzowMSAzNzQ0ODIg
ICAgIC91c3IvamF2YS9qZGsxLjYuMF8wNC9qcmUvbGliL2kzODYvamxpL2xpYmpsaS5zbwpiN2Y0
OTAwMC1iN2Y1OTAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDg0NTMyMiAgICAgL2xpYi9pNjg2L2xp
YnB0aHJlYWQtMi40LnNvCmI3ZjU5MDAwLWI3ZjViMDAwIHJ3eHAgMDAwMGYwMDAgMDM6MDEgODQ1
MzIyICAgICAvbGliL2k2ODYvbGlicHRocmVhZC0yLjQuc28KYjdmNWIwMDAtYjdmNWQwMDAgcnd4
cCBiN2Y1YjAwMCAwMDowMCAwIApiN2Y1ZDAwMC1iN2Y2NTAwMCByd3hzIDAwMDAwMDAwIDAzOjAx
IDc2ODkwNyAgICAgL3RtcC9oc3BlcmZkYXRhX2p1bGllbi8xMDYzNQpiN2Y2NTAwMC1iN2Y2ZDAw
MCByLXhwIDAwMDAwMDAwIDAzOjAxIDg0NTM0OSAgICAgL2xpYi9saWJuc3NfZmlsZXMtMi40LnNv
CmI3ZjZkMDAwLWI3ZjZmMDAwIHJ3eHAgMDAwMDcwMDAgMDM6MDEgODQ1MzQ5ICAgICAvbGliL2xp
Ym5zc19maWxlcy0yLjQuc28KYjdmNmYwMDAtYjdmNzUwMDAgci14cCAwMDAwMDAwMCAwMzowMSAz
NzQ0NjYgICAgIC91c3IvamF2YS9qZGsxLjYuMF8wNC9qcmUvbGliL2kzODYvbmF0aXZlX3RocmVh
ZHMvbGliaHBpLnNvCmI3Zjc1MDAwLWI3Zjc2MDAwIHJ3eHAgMDAwMDYwMDAgMDM6MDEgMzc0NDY2
ICAgICAvdXNyL2phdmEvamRrMS42LjBfMDQvanJlL2xpYi9pMzg2L25hdGl2ZV90aHJlYWRzL2xp
YmhwaS5zbwpiN2Y3NjAwMC1iN2Y3NzAwMCByd3hwIGI3Zjc2MDAwIDAwOjAwIDAgCmI3Zjc3MDAw
LWI3Zjc4MDAwIHIteHAgYjdmNzcwMDAgMDA6MDAgMCAKYjdmNzgwMDAtYjdmNzkwMDAgcnd4cCBi
N2Y3ODAwMCAwMDowMCAwIApiN2Y3OTAwMC1iN2Y5MTAwMCByLXhwIDAwMDAwMDAwIDAzOjAxIDg0
NTMyOCAgICAgL2xpYi9sZC0yLjQuc28KYjdmOTEwMDAtYjdmOTIwMDAgci14cCAwMDAxNzAwMCAw
MzowMSA4NDUzMjggICAgIC9saWIvbGQtMi40LnNvCmI3ZjkyMDAwLWI3ZjkzMDAwIHJ3eHAgMDAw
MTgwMDAgMDM6MDEgODQ1MzI4ICAgICAvbGliL2xkLTIuNC5zbwpiZmUwNTAwMC1iZmUxYjAwMCBy
d3hwIGJmZTA1MDAwIDAwOjAwIDAgICAgICAgICAgW3N0YWNrXQpiZmZmZTAwMC1iZmZmZjAwMCBy
LXhwIGJmZmZlMDAwIDAwOjAwIDAgCgpWTSBBcmd1bWVudHM6CmphdmFfY29tbWFuZDogSGVsbG9X
b3JsZERlbW8KTGF1bmNoZXIgVHlwZTogU1VOX1NUQU5EQVJECgpFbnZpcm9ubWVudCBWYXJpYWJs
ZXM6CkpBVkFfSE9NRT0vdXNyL2phdmEvamRrMS42LjBfMDQKUEFUSD0vdXNyL2JpbjovYmluOi91
c3IvbG9jYWwvYmluOi91c3IvWDExUjYvYmluLzovdXNyL2dhbWVzOi91c3IvbGliL3F0My8vYmlu
Oi91c3IvamF2YS9qZGsxLjYuMF8wNC9iaW4vOi9ob21lL2p1bGllbi9iaW46L3Vzci9qYXZhL2pk
azEuNi4wXzA0L2Jpbi86L3Vzci9saWIvcXQzLy9iaW4KTERfTElCUkFSWV9QQVRIPS91c3IvamF2
YS9qZGsxLjYuMF8wNC9qcmUvbGliL2kzODYvY2xpZW50Oi91c3IvamF2YS9qZGsxLjYuMF8wNC9q
cmUvbGliL2kzODY6L3Vzci9qYXZhL2pkazEuNi4wXzA0L2pyZS8uLi9saWIvaTM4NgpTSEVMTD0v
YmluL2Jhc2gKRElTUExBWT06MC4wCgpTaWduYWwgSGFuZGxlcnM6ClNJR1NFR1Y6IFtsaWJqdm0u
c28rMHgzYmUzNDBdLCBzYV9tYXNrWzBdPTB4N2ZmYmZlZmYsIHNhX2ZsYWdzPTB4MTAwMDAwMDQK
U0lHQlVTOiBbbGlianZtLnNvKzB4M2JlMzQwXSwgc2FfbWFza1swXT0weDdmZmJmZWZmLCBzYV9m
bGFncz0weDEwMDAwMDA0ClNJR0ZQRTogW2xpYmp2bS5zbysweDMwZjQ0MF0sIHNhX21hc2tbMF09
MHg3ZmZiZmVmZiwgc2FfZmxhZ3M9MHgxMDAwMDAwNApTSUdQSVBFOiBbbGlianZtLnNvKzB4MzBm
NDQwXSwgc2FfbWFza1swXT0weDdmZmJmZWZmLCBzYV9mbGFncz0weDEwMDAwMDA0ClNJR1hGU1o6
IFtsaWJqdm0uc28rMHgzMGY0NDBdLCBzYV9tYXNrWzBdPTB4N2ZmYmZlZmYsIHNhX2ZsYWdzPTB4
MTAwMDAwMDQKU0lHSUxMOiBbbGlianZtLnNvKzB4MzBmNDQwXSwgc2FfbWFza1swXT0weDdmZmJm
ZWZmLCBzYV9mbGFncz0weDEwMDAwMDA0ClNJR1VTUjE6IFNJR19ERkwsIHNhX21hc2tbMF09MHgw
MDAwMDAwMCwgc2FfZmxhZ3M9MHgwMDAwMDAwMApTSUdVU1IyOiBbbGlianZtLnNvKzB4MzExNDgw
XSwgc2FfbWFza1swXT0weDAwMDAwMDAwLCBzYV9mbGFncz0weDEwMDAwMDA0ClNJR0hVUDogW2xp
Ymp2bS5zbysweDMxMTIyMF0sIHNhX21hc2tbMF09MHg3ZmZiZmVmZiwgc2FfZmxhZ3M9MHgxMDAw
MDAwNApTSUdJTlQ6IFtsaWJqdm0uc28rMHgzMTEyMjBdLCBzYV9tYXNrWzBdPTB4N2ZmYmZlZmYs
IHNhX2ZsYWdzPTB4MTAwMDAwMDQKU0lHVEVSTTogW2xpYmp2bS5zbysweDMxMTIyMF0sIHNhX21h
c2tbMF09MHg3ZmZiZmVmZiwgc2FfZmxhZ3M9MHgxMDAwMDAwNApTSUdRVUlUOiBbbGlianZtLnNv
KzB4MzExMjIwXSwgc2FfbWFza1swXT0weDdmZmJmZWZmLCBzYV9mbGFncz0weDEwMDAwMDA0CgoK
LS0tLS0tLS0tLS0tLS0tICBTIFkgUyBUIEUgTSAgLS0tLS0tLS0tLS0tLS0tCgpPUzpNYW5kcml2
YSBMaW51eCByZWxlYXNlIDIwMDcuMSAoT2ZmaWNpYWwpIGZvciBpNTg2Cgp1bmFtZTpMaW51eCAy
LjYuMTctMTZtZHYgIzEgU01QIFdlZCBTZXAgMjYgMTY6MTA6NDggRURUIDIwMDcgaTY4NgpsaWJj
OmdsaWJjIDIuNCBOUFRMIDIuNCAKcmxpbWl0OiBTVEFDSyA4MTkyaywgQ09SRSAwaywgTlBST0Mg
MTYzODMsIE5PRklMRSAxMDI0LCBBUyBpbmZpbml0eQpsb2FkIGF2ZXJhZ2U6MC4yOCAwLjI3IDAu
MjgKCkNQVTp0b3RhbCAxICgxIGNvcmVzIHBlciBjcHUsIDEgdGhyZWFkcyBwZXIgY29yZSkgZmFt
aWx5IDYgbW9kZWwgOCBzdGVwcGluZyAxLCBjbW92LCBjeDgsIGZ4c3IsIG1teCwgc3NlLCBtbXhl
eHQsIDNkbm93LCAzZG5vd2V4dAoKTWVtb3J5OiA0ayBwYWdlLCBwaHlzaWNhbCAyMDc1ODIwaygz
NjIzMzJrIGZyZWUpLCBzd2FwIDQwODg1MDBrKDQwODg1MDBrIGZyZWUpCgp2bV9pbmZvOiBKYXZh
IEhvdFNwb3QoVE0pIENsaWVudCBWTSAoMTAuMC1iMTkpIGZvciBsaW51eC14ODYgSlJFICgxLjYu
MF8wNC1iMTIpLCBidWlsdCBvbiBEZWMgMTQgMjAwNyAwMTowOTo0NyBieSAiamF2YV9yZSIgd2l0
aCBnY2MgMy4yLjEtN2EgKEoyU0UgcmVsZWFzZSkKCnRpbWU6IFNhdCBNYXkgMzEgMTc6MTE6MTQg
MjAwOAplbGFwc2VkIHRpbWU6IDAgc2Vjb25kcwoK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>127</attachid>
            <date>2008-06-01 05:10:00 +0200</date>
            <delta_ts>2008-06-01 05:10:00 +0200</delta_ts>
            <desc>source code to reproduce the bug easily</desc>
            <filename>HelloWorldDemo.java</filename>
            <type>text/plain</type>
            <size>3101</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">aW1wb3J0IGphdmEuYXd0Lio7CmltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwpp
bXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7CmltcG9ydCBqYXZhLm5pby5GbG9hdEJ1
ZmZlcjsKCmltcG9ydCBjb20uc3VuLm9wZW5nbC51dGlsLkFuaW1hdG9yOwppbXBvcnQgY29tLnN1
bi5vcGVuZ2wudXRpbC5CdWZmZXJVdGlsOwppbXBvcnQgY29tLnN1bi5vcGVuZ2wudXRpbC5qMmQu
VGV4dFJlbmRlcmVyOwppbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMOwppbXBvcnQgamF2YXgu
bWVkaWEub3BlbmdsLkdMQ2FudmFzOwppbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQ2FwYWJp
bGl0aWVzOwppbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQXV0b0RyYXdhYmxlOwppbXBvcnQg
amF2YXgubWVkaWEub3BlbmdsLkdMRXZlbnRMaXN0ZW5lcjsKCnB1YmxpYyBjbGFzcyBIZWxsb1dv
cmxkRGVtbyBleHRlbmRzIEZyYW1lIGltcGxlbWVudHMgR0xFdmVudExpc3RlbmVyewogICAgCiAg
ICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKICAgIHBy
aXZhdGUgVGV4dFJlbmRlcmVyIHRleHRSZW5kZXJlcjsKICAgIHByaXZhdGUgaW50W10gaWQ9bmV3
IGludFsxXTsKICAgIHByaXZhdGUgRmxvYXRCdWZmZXIgYnVmZmVyPUJ1ZmZlclV0aWwubmV3Rmxv
YXRCdWZmZXIoMCk7CiAgICAKICAgIHB1YmxpYyBIZWxsb1dvcmxkRGVtbygpewogICAgICAgIHN1
cGVyKCJKT0dMIDEuMS4xIik7CiAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7
CiAgICAgICAgc2V0U2l6ZSg0MDAsIDQwMCk7CiAgICAgICAgc2V0TG9jYXRpb24oNDAsIDQwKTsK
ICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwogICAgICAgIEdMQ2FwYWJpbGl0aWVzIGNhcHMgPSBu
ZXcgR0xDYXBhYmlsaXRpZXMoKTsKICAgICAgICBjYXBzLnNldERvdWJsZUJ1ZmZlcmVkKHRydWUp
OwogICAgICAgIGNhcHMuc2V0SGFyZHdhcmVBY2NlbGVyYXRlZCh0cnVlKTsKICAgICAgICBHTENh
bnZhcyBjYW52YXMgPSBuZXcgR0xDYW52YXMoY2Fwcyk7CiAgICAgICAgY2FudmFzLmFkZEdMRXZl
bnRMaXN0ZW5lcih0aGlzKTsKICAgICAgICBhZGQoY2FudmFzLCBCb3JkZXJMYXlvdXQuQ0VOVEVS
KTsKICAgICAgICBBbmltYXRvciBhbmltID0gbmV3IEFuaW1hdG9yKGNhbnZhcyk7CiAgICAgICAg
YW5pbS5zdGFydCgpOwogICAgICAgIGFkZFdpbmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVy
KCl7CiAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSl7
CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKICAgICAgICAgICAgfQogICAgICAgIH0p
OwogICAgICAgIGJ1ZmZlci5wdXQobmV3IGZsb2F0W117fSk7CiAgICAgICAgYnVmZmVyLnBvc2l0
aW9uKDApOwogICAgfQoKICAgIAogICAgcHVibGljIHZvaWQgaW5pdChHTEF1dG9EcmF3YWJsZSBk
cmF3YWJsZSl7CiAgICAgICAgR0wgZ2wgPSBkcmF3YWJsZS5nZXRHTCgpOwogICAgICAgIGdsLmds
Q2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKICAgICAgICBnbC5nbE1hdHJpeE1vZGUoR0wuR0xfUFJP
SkVDVElPTik7CiAgICAgICAgZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKICAgICAgICBnbC5nbE9ydGhv
KDAsIDEsIDAsIDEsIC0xLCAxKTsKICAgICAgICB0ZXh0UmVuZGVyZXI9bmV3IFRleHRSZW5kZXJl
cihuZXcgRm9udCgiU2Fuc1NlcmlmIixGb250LlBMQUlOLDEyKSk7CiAgICAgICAgZ2wuZ2xHZW5C
dWZmZXJzKDEsaWQsMCk7CiAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZF
UixpZFswXSk7CiAgICAgICAgZ2wuZ2xCdWZmZXJEYXRhKEdMLkdMX0FSUkFZX0JVRkZFUixCdWZm
ZXJVdGlsLlNJWkVPRl9GTE9BVCpidWZmZXIuY2FwYWNpdHkoKSxidWZmZXIsR0wuR0xfU1RBVElD
X0RSQVdfQVJCKTsKICAgICAgICB0aGlzLmJ1ZmZlci5wb3NpdGlvbigwKTsKICAgIH0KCiAgICBw
dWJsaWMgdm9pZCByZXNoYXBlKEdMQXV0b0RyYXdhYmxlIGRyYXdhYmxlLAogICAgICAgICAgICAg
ICAgICAgICAgICBpbnQgeCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCiAgICAgICAg
ICAgICAgICAgICAgICAgIGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhl
aWdodCl7CiAgICB9CgogICAgcHVibGljIHZvaWQgZGlzcGxheUNoYW5nZWQoR0xBdXRvRHJhd2Fi
bGUgZHJhd2FibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1vZGVD
aGFuZ2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZXZpY2VDaGFu
Z2VkKXsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBkaXNwbGF5KEdMQXV0b0RyYXdhYmxlIGRyYXdh
YmxlKXsKICAgICAgICBHTCBnbCA9IGRyYXdhYmxlLmdldEdMKCk7CiAgICAgICAgZ2wuZ2xDbGVh
cihHTC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKICAgICAgICBnbC5nbEVuYWJsZUNsaWVudFN0YXRl
KEdMLkdMX1ZFUlRFWF9BUlJBWSk7CiAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTC5H
TF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wuR0xfQVJS
QVlfQlVGRkVSLGlkWzBdKTsKICAgICAgICBnbC5nbERyYXdBcnJheXMoR0wuR0xfUVVBRFMsMCww
KTsKICAgICAgICBnbC5nbERpc2FibGVDbGllbnRTdGF0ZShHTC5HTF9URVhUVVJFX0NPT1JEX0FS
UkFZKTsgICAgICAgCiAgICAgICAgZ2wuZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0wuR0xfVkVSVEVY
X0FSUkFZKTsKICAgICAgICB0ZXh0UmVuZGVyZXIuYmVnaW5SZW5kZXJpbmcoMTAwLDEwMCk7CiAg
ICAgICAgdGV4dFJlbmRlcmVyLmRyYXcoIkpPR0wgMS4xLjEiLDAsMCk7CiAgICAgICAgdGV4dFJl
bmRlcmVyLmVuZFJlbmRlcmluZygpOyAgICAgICAKICAgICAgICBnbC5nbEZsdXNoKCk7CiAgICB9
CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CiAgICAgICAgSGVs
bG9Xb3JsZERlbW8gZGVtbyA9IG5ldyBIZWxsb1dvcmxkRGVtbygpOwogICAgICAgIGRlbW8uc2V0
VmlzaWJsZSh0cnVlKTsKICAgIH0KfQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>128</attachid>
            <date>2008-06-02 12:59:00 +0200</date>
            <delta_ts>2008-06-02 12:59:00 +0200</delta_ts>
            <desc>Cleanest bug fix (force the use of VBO on OpenGL 1.4 if GL_ARB_vertex_buffer_object is available)</desc>
            <filename>TextRenderer.java</filename>
            <type>text/plain</type>
            <size>79122</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChjKSAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKICogbWV0OgogKgog
KiAtIFJlZGlzdHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIC0gUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgogKgogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIElu
Yy4gb3IgdGhlIG5hbWVzIG9mCiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRoaXMgc29mdHdhcmUg
aXMgcHJvdmlkZWQgIkFTIElTLCIgd2l0aG91dCBhIHdhcnJhbnR5IG9mIGFueSBraW5kLiBBTEwK
ICogRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FS
UkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJ
TElUWSwgRklUTkVTUyBGT1IgQQogKiBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdF
TUVOVCwgQVJFIEhFUkVCWSBFWENMVURFRC4gU1VOCiAqIE1JQ1JPU1lTVEVNUywgSU5DLiAoIlNV
TiIpIEFORCBJVFMgTElDRU5TT1JTIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SCiAqIEFOWSBEQU1B
R0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIFVTSU5HLCBNT0RJRllJTkcg
T1IKICogRElTVFJJQlVUSU5HIFRISVMgU09GVFdBUkUgT1IgSVRTIERFUklWQVRJVkVTLiBJTiBO
TyBFVkVOVCBXSUxMIFNVTiBPUgogKiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIExP
U1QgUkVWRU5VRSwgUFJPRklUIE9SIERBVEEsIE9SIEZPUgogKiBESVJFQ1QsIElORElSRUNULCBT
UEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SIFBVTklUSVZFCiAqIERBTUFHRVMs
IEhPV0VWRVIgQ0FVU0VEIEFORCBSRUdBUkRMRVNTIE9GIFRIRSBUSEVPUlkgT0YgTElBQklMSVRZ
LAogKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRgogKiBTVU4gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0VTLgogKgogKiBZb3UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIHNvZnR3
YXJlIGlzIG5vdCBkZXNpZ25lZCBvciBpbnRlbmRlZCBmb3IgdXNlCiAqIGluIHRoZSBkZXNpZ24s
IGNvbnN0cnVjdGlvbiwgb3BlcmF0aW9uIG9yIG1haW50ZW5hbmNlIG9mIGFueSBudWNsZWFyCiAq
IGZhY2lsaXR5LgogKgogKiBTdW4gZ3JhdGVmdWxseSBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIHNv
ZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGF1dGhvcmVkCiAqIGFuZCBkZXZlbG9wZWQgYnkgS2VubmV0
aCBCcmFkbGV5IFJ1c3NlbGwgYW5kIENocmlzdG9waGVyIEpvaG4gS2xpbmUuCiAqLwpwYWNrYWdl
IGNvbS5zdW4ub3BlbmdsLnV0aWwuajJkOwoKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwuKjsK
aW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwucGFja3JlY3QuKjsKaW1wb3J0IGNvbS5zdW4ub3Bl
bmdsLnV0aWwuKjsKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLnV0aWwudGV4dHVyZS4qOwoKaW1wb3J0
IGphdmEuYXd0LkFscGhhQ29tcG9zaXRlOwppbXBvcnQgamF2YS5hd3QuQ29sb3I7CmltcG9ydCBq
YXZhLmF3dC5Db21wb3NpdGU7CgovLyBGb3IgZGVidWdnaW5nIHB1cnBvc2VzCmltcG9ydCBqYXZh
LmF3dC5FdmVudFF1ZXVlOwppbXBvcnQgamF2YS5hd3QuRm9udDsKaW1wb3J0IGphdmEuYXd0LkZy
YW1lOwppbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKaW1wb3J0IGphdmEuYXd0LkltYWdlOwpp
bXBvcnQgamF2YS5hd3QuUG9pbnQ7CmltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKaW1w
b3J0IGphdmEuYXd0LmV2ZW50Lio7CmltcG9ydCBqYXZhLmF3dC5mb250Lio7CmltcG9ydCBqYXZh
LmF3dC5nZW9tLio7CgppbXBvcnQgamF2YS5uaW8uKjsKCmltcG9ydCBqYXZhLnRleHQuKjsKCmlt
cG9ydCBqYXZhLnV0aWwuKjsKCmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuKjsKaW1wb3J0IGph
dmF4Lm1lZGlhLm9wZW5nbC5nbHUuKjsKCgovKiogUmVuZGVycyBiaXRtYXBwZWQgSmF2YSAyRCB0
ZXh0IGludG8gYW4gT3BlbkdMIHdpbmRvdyB3aXRoIGhpZ2gKICAgIHBlcmZvcm1hbmNlLCBmdWxs
IFVuaWNvZGUgc3VwcG9ydCwgYW5kIGEgc2ltcGxlIEFQSS4gUGVyZm9ybXMKICAgIGFwcHJvcHJp
YXRlIGNhY2hpbmcgb2YgdGV4dCByZW5kZXJpbmcgcmVzdWx0cyBpbiBhbiBPcGVuR0wgdGV4dHVy
ZQogICAgaW50ZXJuYWxseSB0byBhdm9pZCByZXBlYXRlZCBmb250IHJhc3Rlcml6YXRpb24uIFRo
ZSBjYWNoaW5nIGlzCiAgICBjb21wbGV0ZWx5IGF1dG9tYXRpYywgZG9lcyBub3QgcmVxdWlyZSBh
bnkgdXNlciBpbnRlcnZlbnRpb24sIGFuZAogICAgaGFzIG5vIHZpc2libGUgY29udHJvbHMgaW4g
dGhlIHB1YmxpYyBBUEkuIDxQPgoKICAgIFVzaW5nIHRoZSB7QGxpbmsgVGV4dFJlbmRlcmVyIFRl
eHRSZW5kZXJlcn0gaXMgc2ltcGxlLiBBZGQgYQogICAgIjxjb2RlPlRleHRSZW5kZXJlciByZW5k
ZXJlcjs8L2NvZGU+IiBmaWVsZCB0byB5b3VyIHtAbGluawogICAgamF2YXgubWVkaWEub3Blbmds
LkdMRXZlbnRMaXN0ZW5lciBHTEV2ZW50TGlzdGVuZXJ9LiBJbiB5b3VyIHtAbGluawogICAgamF2
YXgubWVkaWEub3BlbmdsLkdMRXZlbnRMaXN0ZW5lciNpbml0IGluaXR9IG1ldGhvZCwgYWRkOgoK
ICAgIDxQUkU+CiAgICByZW5kZXJlciA9IG5ldyBUZXh0UmVuZGVyZXIobmV3IEZvbnQoIlNhbnNT
ZXJpZiIsIEZvbnQuQk9MRCwgMzYpKTsKICAgIDwvUFJFPgoKICAgIDxQPiBJbiB0aGUge0BsaW5r
IGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIjZGlzcGxheSBkaXNwbGF5fSBtZXRo
b2Qgb2YgeW91cgogICAge0BsaW5rIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIg
R0xFdmVudExpc3RlbmVyfSwgYWRkOgogICAgPFBSRT4KICAgIHJlbmRlcmVyLmJlZ2luUmVuZGVy
aW5nKGRyYXdhYmxlLmdldFdpZHRoKCksIGRyYXdhYmxlLmdldEhlaWdodCgpKTsKICAgIC8vIG9w
dGlvbmFsbHkgc2V0IHRoZSBjb2xvcgogICAgcmVuZGVyZXIuc2V0Q29sb3IoMS4wZiwgMC4yZiwg
MC4yZiwgMC44Zik7CiAgICByZW5kZXJlci5kcmF3KCJUZXh0IHRvIGRyYXciLCB4UG9zaXRpb24s
IHlQb3NpdGlvbik7CiAgICAvLyAuLi4gbW9yZSBkcmF3IGNvbW1hbmRzLCBjb2xvciBjaGFuZ2Vz
LCBldGMuCiAgICByZW5kZXJlci5lbmRSZW5kZXJpbmcoKTsKICAgIDwvUFJFPgoKICAgIFVubGVz
cyB5b3UgYXJlIHNoYXJpbmcgdGV4dHVyZXMgYW5kIGRpc3BsYXkgbGlzdHMgYmV0d2VlbiBPcGVu
R0wKICAgIGNvbnRleHRzLCB5b3UgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGUge0BsaW5rICNkaXNw
b3NlIGRpc3Bvc2V9CiAgICBtZXRob2Qgb2YgdGhlIFRleHRSZW5kZXJlcjsgdGhlIE9wZW5HTCBy
ZXNvdXJjZXMgaXQgdXNlcwogICAgaW50ZXJuYWxseSB3aWxsIGJlIGNsZWFuZWQgdXAgYXV0b21h
dGljYWxseSB3aGVuIHRoZSBPcGVuR0wKICAgIGNvbnRleHQgaXMgZGVzdHJveWVkLiA8UD4KCiAg
ICA8Yj5Ob3RlPC9iPiB0aGF0IHRoZSBUZXh0UmVuZGVyZXIgbWF5IGNhdXNlIHRoZSB2ZXJ0ZXgg
YW5kIHRleHR1cmUKICAgIGNvb3JkaW5hdGUgYXJyYXkgYnVmZmVyIGJpbmRpbmdzIHRvIGNoYW5n
ZSwgb3IgdG8gYmUgdW5ib3VuZC4gVGhpcwogICAgaXMgaW1wb3J0YW50IHRvIG5vdGUgaWYgeW91
IGFyZSB1c2luZyBWZXJ0ZXggQnVmZmVyIE9iamVjdHMgKFZCT3MpCiAgICBpbiB5b3VyIGFwcGxp
Y2F0aW9uLiA8UD4KCiAgICBJbnRlcm5hbGx5LCB0aGUgcmVuZGVyZXIgdXNlcyBhIHJlY3Rhbmds
ZSBwYWNraW5nIGFsZ29yaXRobSB0bwogICAgcGFjayBib3RoIGdseXBocyBhbmQgZnVsbCBTdHJp
bmdzJyByZW5kZXJpbmcgcmVzdWx0cyAod2hpY2ggYXJlCiAgICB2YXJpYWJsZSBzaXplKSBvbnRv
IGEgbGFyZ2VyIE9wZW5HTCB0ZXh0dXJlLiBUaGUgaW50ZXJuYWwgYmFja2luZwogICAgc3RvcmUg
aXMgbWFpbnRhaW5lZCB1c2luZyBhIHtAbGluawogICAgY29tLnN1bi5vcGVuZ2wudXRpbC5qMmQu
VGV4dHVyZVJlbmRlcmVyIFRleHR1cmVSZW5kZXJlcn0uIEEgbGVhc3QKICAgIHJlY2VudGx5IHVz
ZWQgKExSVSkgYWxnb3JpdGhtIGlzIHVzZWQgdG8gZGlzY2FyZCBwcmV2aW91c2x5CiAgICByZW5k
ZXJlZCBzdHJpbmdzOyB0aGUgc3BlY2lmaWMgYWxnb3JpdGhtIGlzIHVuZGVmaW5lZCwgYnV0IGlz
CiAgICBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYnkgZmx1c2hpbmcgdW51c2VkIFN0cmluZ3MnIHJl
bmRlcmluZwogICAgcmVzdWx0cyBldmVyeSBmZXcgaHVuZHJlZCByZW5kZXJpbmcgY3ljbGVzLCB3
aGVyZSBhIHJlbmRlcmluZwogICAgY3ljbGUgaXMgZGVmaW5lZCBhcyBhIHBhaXIgb2YgY2FsbHMg
dG8ge0BsaW5rICNiZWdpblJlbmRlcmluZwogICAgYmVnaW5SZW5kZXJpbmd9IC8ge0BsaW5rICNl
bmRSZW5kZXJpbmcgZW5kUmVuZGVyaW5nfS4KCiAgICBAYXV0aG9yIEpvaG4gQnVya2V5CiAgICBA
YXV0aG9yIEtlbm5ldGggUnVzc2VsbAoqLwpwdWJsaWMgY2xhc3MgVGV4dFJlbmRlcmVyIHsKICAg
IHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEZWJ1Zy5kZWJ1ZygiVGV4dFJl
bmRlcmVyIik7CgogICAgLy8gVGhlc2UgYXJlIG9jY2FzaW9uYWxseSB1c2VmdWwgZm9yIG1vcmUg
aW4tZGVwdGggZGVidWdnaW5nCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU0FC
TEVfR0xZUEhfQ0FDSEUgPSBmYWxzZTsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4g
RFJBV19CQk9YRVMgPSBmYWxzZTsKCiAgICBzdGF0aWMgZmluYWwgaW50IGtTaXplID0gMjU2OwoK
ICAgIC8vIEV2ZXJ5IGNlcnRhaW4gbnVtYmVyIG9mIHJlbmRlciBjeWNsZXMsIGZsdXNoIHRoZSBz
dHJpbmdzIHdoaWNoCiAgICAvLyBoYXZlbid0IGJlZW4gdXNlZCByZWNlbnRseQogICAgcHJpdmF0
ZSBzdGF0aWMgZmluYWwgaW50IENZQ0xFU19QRVJfRkxVU0ggPSAxMDA7CgogICAgLy8gVGhlIGFt
b3VudCBvZiB2ZXJ0aWNhbCBkZWFkIHNwYWNlIG9uIHRoZSBiYWNraW5nIHN0b3JlIGJlZm9yZSB3
ZQogICAgLy8gZm9yY2UgYSBjb21wYWN0aW9uCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9h
dCBNQVhfVkVSVElDQUxfRlJBR01FTlRBVElPTiA9IDAuN2Y7CiAgICBzdGF0aWMgZmluYWwgaW50
IGtRdWFkc1BlckJ1ZmZlciA9IDEwMDsKICAgIHN0YXRpYyBmaW5hbCBpbnQga0Nvb3Jkc1BlclZl
cnRWZXJ0cyA9IDM7CiAgICBzdGF0aWMgZmluYWwgaW50IGtDb29yZHNQZXJWZXJ0VGV4ID0gMjsK
ICAgIHN0YXRpYyBmaW5hbCBpbnQga1ZlcnRzUGVyUXVhZCA9IDQ7CiAgICBzdGF0aWMgZmluYWwg
aW50IGtUb3RhbEJ1ZmZlclNpemVWZXJ0cyA9IGtRdWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1
YWQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNWZXJ0cyA9IGtR
dWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1YWQgKiBrQ29vcmRzUGVyVmVydFZlcnRzOwogICAg
c3RhdGljIGZpbmFsIGludCBrVG90YWxCdWZmZXJTaXplQ29vcmRzVGV4ID0ga1F1YWRzUGVyQnVm
ZmVyICoga1ZlcnRzUGVyUXVhZCAqIGtDb29yZHNQZXJWZXJ0VGV4OwogICAgc3RhdGljIGZpbmFs
IGludCBrVG90YWxCdWZmZXJTaXplQnl0ZXNWZXJ0cyA9IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNW
ZXJ0cyAqIDQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVCeXRlc1RleCA9
IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNUZXggKiA0OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6
ZUluQnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSA9IGtDb29yZHNQZXJWZXJ0VmVydHMgKiA0
OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6ZUluQnl0ZXNfT25lVmVydGljZXNfVGV4RGF0YSA9
IGtDb29yZHNQZXJWZXJ0VGV4ICogNDsKICAgIHByaXZhdGUgRm9udCBmb250OwogICAgcHJpdmF0
ZSBib29sZWFuIGFudGlhbGlhc2VkOwogICAgcHJpdmF0ZSBib29sZWFuIHVzZUZyYWN0aW9uYWxN
ZXRyaWNzOwoKICAgIC8vIFdoZXRoZXIgd2UncmUgYXR0ZW1wdGluZyB0byB1c2UgYXV0b21hdGlj
IG1pcG1hcCBnZW5lcmF0aW9uIHN1cHBvcnQKICAgIHByaXZhdGUgYm9vbGVhbiBtaXBtYXA7CiAg
ICBwcml2YXRlIFJlY3RhbmdsZVBhY2tlciBwYWNrZXI7CiAgICBwcml2YXRlIGJvb2xlYW4gaGF2
ZU1heFNpemU7CiAgICBwcml2YXRlIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlOwogICAg
cHJpdmF0ZSBUZXh0dXJlUmVuZGVyZXIgY2FjaGVkQmFja2luZ1N0b3JlOwogICAgcHJpdmF0ZSBH
cmFwaGljczJEIGNhY2hlZEdyYXBoaWNzOwogICAgcHJpdmF0ZSBGb250UmVuZGVyQ29udGV4dCBj
YWNoZWRGb250UmVuZGVyQ29udGV4dDsKICAgIHByaXZhdGUgTWFwIC8qPFN0cmluZyxSZWN0Piov
IHN0cmluZ0xvY2F0aW9ucyA9IG5ldyBIYXNoTWFwIC8qPFN0cmluZyxSZWN0PiovKCk7CiAgICBw
cml2YXRlIEdseXBoUHJvZHVjZXIgbUdseXBoUHJvZHVjZXI7CgogICAgcHJpdmF0ZSBpbnQgbnVt
UmVuZGVyQ3ljbGVzOwoKICAgIC8vIE5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3Jl
IGluIGEgYmVnaW5SZW5kZXJpbmcoKSAvCiAgICAvLyBlbmRSZW5kZXJpbmcoKSBjeWNsZSBzbyB3
ZSBjYW4gcmUtZW50ZXIgdGhlIGV4YWN0IHNhbWUgc3RhdGUgaWYKICAgIC8vIHdlIGhhdmUgdG8g
cmVhbGxvY2F0ZSB0aGUgYmFja2luZyBzdG9yZQogICAgcHJpdmF0ZSBib29sZWFuIGluQmVnaW5F
bmRQYWlyOwogICAgcHJpdmF0ZSBib29sZWFuIGlzT3J0aG9Nb2RlOwogICAgcHJpdmF0ZSBpbnQg
YmVnaW5SZW5kZXJpbmdXaWR0aDsKICAgIHByaXZhdGUgaW50IGJlZ2luUmVuZGVyaW5nSGVpZ2h0
OwogICAgcHJpdmF0ZSBib29sZWFuIGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQ7Cgog
ICAgLy8gRm9yIHJlc2V0dGluZyB0aGUgY29sb3IgYWZ0ZXIgZGlzcG9zYWwgb2YgdGhlIG9sZCBi
YWNraW5nIHN0b3JlCiAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUNhY2hlZENvbG9yOwogICAgcHJp
dmF0ZSBmbG9hdCBjYWNoZWRSOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRHOwogICAgcHJpdmF0
ZSBmbG9hdCBjYWNoZWRCOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRBOwogICAgcHJpdmF0ZSBD
b2xvciBjYWNoZWRDb2xvcjsKICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9SZXNldENvbG9yOwoK
ICAgIC8vIEZvciBkZWJ1Z2dpbmcgb25seQogICAgcHJpdmF0ZSBGcmFtZSBkYmdGcmFtZTsKCiAg
ICAvLyBEZWJ1Z2dpbmcgcHVycG9zZXMgb25seQogICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnZ2Vk
OwogICAgUGlwZWxpbmVkX1F1YWRSZW5kZXJlciBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyOwogICAg
CiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcKICAgIHByaXZhdGUgYm9vbGVhbiB1c2VW
ZXJ0ZXhBcnJheXMgPSB0cnVlOwogICAgCiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcK
ICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dGVuc2lvbkF2YWlsYWJsZV9WQk87CiAgICBwcml2YXRl
IGJvb2xlYW4gY2hlY2tGb3JfaXNFeHRlbnNpb25BdmFpbGFibGVfVkJPOwoKICAgIC8vIFdoZXRo
ZXIgR0xfTElORUFSIGZpbHRlcmluZyBpcyBlbmFibGVkIGZvciB0aGUgYmFja2luZyBzdG9yZQog
ICAgcHJpdmF0ZSBib29sZWFuIHNtb290aGluZyA9IHRydWU7CgogICAgLyoqIENyZWF0ZXMgYSBu
ZXcgVGV4dFJlbmRlcmVyIHdpdGggdGhlIGdpdmVuIGZvbnQsIHVzaW5nIG5vCiAgICAgICAgYW50
aWFsaWFzaW5nIG9yIGZyYWN0aW9uYWwgbWV0cmljcywgYW5kIHRoZSBkZWZhdWx0CiAgICAgICAg
UmVuZGVyRGVsZWdhdGUuIEVxdWl2YWxlbnQgdG8gPGNvZGU+VGV4dFJlbmRlcmVyKGZvbnQsIGZh
bHNlLAogICAgICAgIGZhbHNlKTwvY29kZT4uCgogICAgICAgIEBwYXJhbSBmb250IHRoZSBmb250
IHRvIHJlbmRlciB3aXRoCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQp
IHsKICAgICAgICB0aGlzKGZvbnQsIGZhbHNlLCBmYWxzZSwgbnVsbCwgZmFsc2UpOwogICAgfQoK
ICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRSZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBmb250LCB1
c2luZyBubwogICAgICAgIGFudGlhbGlhc2luZyBvciBmcmFjdGlvbmFsIG1ldHJpY3MsIGFuZCB0
aGUgZGVmYXVsdAogICAgICAgIFJlbmRlckRlbGVnYXRlLiBJZiA8Q09ERT5taXBtYXA8L0NPREU+
IGlzIHRydWUsIGF0dGVtcHRzIHRvIHVzZQogICAgICAgIE9wZW5HTCdzIGF1dG9tYXRpYyBtaXBt
YXAgZ2VuZXJhdGlvbiBmb3IgYmV0dGVyIHNtb290aGluZyB3aGVuCiAgICAgICAgcmVuZGVyaW5n
IHRoZSBUZXh0dXJlUmVuZGVyZXIncyBjb250ZW50cyBhdCBhIGRpc3RhbmNlLgogICAgICAgIEVx
dWl2YWxlbnQgdG8gPGNvZGU+VGV4dFJlbmRlcmVyKGZvbnQsIGZhbHNlLCBmYWxzZSk8L2NvZGU+
LgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0aAogICAgICAgIEBw
YXJhbSBtaXBtYXAgd2hldGhlciB0byBhdHRlbXB0IHVzZSBvZiBhdXRvbWF0aWMgbWlwbWFwIGdl
bmVyYXRpb24KICAgICovCiAgICBwdWJsaWMgVGV4dFJlbmRlcmVyKEZvbnQgZm9udCwgYm9vbGVh
biBtaXBtYXApIHsKICAgICAgICB0aGlzKGZvbnQsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbWlwbWFw
KTsKICAgIH0KCiAgICAvKiogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgd2l0aCB0aGUgZ2l2
ZW4gRm9udCwgc3BlY2lmaWVkIGZvbnQKICAgICAgICBwcm9wZXJ0aWVzLCBhbmQgZGVmYXVsdCBS
ZW5kZXJEZWxlZ2F0ZS4gVGhlCiAgICAgICAgPGNvZGU+YW50aWFsaWFzZWQ8L2NvZGU+IGFuZCA8
Y29kZT51c2VGcmFjdGlvbmFsTWV0cmljczwvY29kZT4KICAgICAgICBmbGFncyBwcm92aWRlIGNv
bnRyb2wgb3ZlciB0aGUgc2FtZSBwcm9wZXJ0aWVzIGF0IHRoZSBKYXZhIDJECiAgICAgICAgbGV2
ZWwuIE5vIG1pcG1hcCBzdXBwb3J0IGlzIHJlcXVlc3RlZC4gRXF1aXZhbGVudCB0bwogICAgICAg
IDxjb2RlPlRleHRSZW5kZXJlcihmb250LCBhbnRpYWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJp
Y3MsCiAgICAgICAgbnVsbCk8L2NvZGU+LgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0
byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJhbSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBh
bnRpYWxpYXNlZCBmb250cwogICAgICAgIEBwYXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0
aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQKICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJE
IGxldmVsCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQsIGJvb2xlYW4g
YW50aWFsaWFzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRnJhY3Rpb25h
bE1ldHJpY3MpIHsKICAgICAgICB0aGlzKGZvbnQsIGFudGlhbGlhc2VkLCB1c2VGcmFjdGlvbmFs
TWV0cmljcywgbnVsbCwgZmFsc2UpOwogICAgfQoKICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRS
ZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBGb250LCBzcGVjaWZpZWQgZm9udAogICAgICAgIHByb3Bl
cnRpZXMsIGFuZCBnaXZlbiBSZW5kZXJEZWxlZ2F0ZS4gVGhlCiAgICAgICAgPGNvZGU+YW50aWFs
aWFzZWQ8L2NvZGU+IGFuZCA8Y29kZT51c2VGcmFjdGlvbmFsTWV0cmljczwvY29kZT4KICAgICAg
ICBmbGFncyBwcm92aWRlIGNvbnRyb2wgb3ZlciB0aGUgc2FtZSBwcm9wZXJ0aWVzIGF0IHRoZSBK
YXZhIDJECiAgICAgICAgbGV2ZWwuIFRoZSA8Y29kZT5yZW5kZXJEZWxlZ2F0ZTwvY29kZT4gcHJv
dmlkZXMgbW9yZSBjb250cm9sCiAgICAgICAgb3ZlciB0aGUgdGV4dCByZW5kZXJlZC4gTm8gbWlw
bWFwIHN1cHBvcnQgaXMgcmVxdWVzdGVkLgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0
byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJhbSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBh
bnRpYWxpYXNlZCBmb250cwogICAgICAgIEBwYXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0
aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQKICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJE
IGxldmVsCiAgICAgICAgQHBhcmFtIHJlbmRlckRlbGVnYXRlIHRoZSByZW5kZXIgZGVsZWdhdGUg
dG8gdXNlIHRvIGRyYXcgdGhlCiAgICAgICAgdGV4dCdzIGJpdG1hcCwgb3IgbnVsbCB0byB1c2Ug
dGhlIGRlZmF1bHQgb25lCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQs
IGJvb2xlYW4gYW50aWFsaWFzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNl
RnJhY3Rpb25hbE1ldHJpY3MsIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlKSB7CiAgICAg
ICAgdGhpcyhmb250LCBhbnRpYWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJpY3MsIHJlbmRlckRl
bGVnYXRlLCBmYWxzZSk7CiAgICB9CgogICAgLyoqIENyZWF0ZXMgYSBuZXcgVGV4dFJlbmRlcmVy
IHdpdGggdGhlIGdpdmVuIEZvbnQsIHNwZWNpZmllZCBmb250CiAgICAgICAgcHJvcGVydGllcywg
YW5kIGdpdmVuIFJlbmRlckRlbGVnYXRlLiBUaGUKICAgICAgICA8Y29kZT5hbnRpYWxpYXNlZDwv
Y29kZT4gYW5kIDxjb2RlPnVzZUZyYWN0aW9uYWxNZXRyaWNzPC9jb2RlPgogICAgICAgIGZsYWdz
IHByb3ZpZGUgY29udHJvbCBvdmVyIHRoZSBzYW1lIHByb3BlcnRpZXMgYXQgdGhlIEphdmEgMkQK
ICAgICAgICBsZXZlbC4gVGhlIDxjb2RlPnJlbmRlckRlbGVnYXRlPC9jb2RlPiBwcm92aWRlcyBt
b3JlIGNvbnRyb2wKICAgICAgICBvdmVyIHRoZSB0ZXh0IHJlbmRlcmVkLiBJZiA8Q09ERT5taXBt
YXA8L0NPREU+IGlzIHRydWUsIGF0dGVtcHRzCiAgICAgICAgdG8gdXNlIE9wZW5HTCdzIGF1dG9t
YXRpYyBtaXBtYXAgZ2VuZXJhdGlvbiBmb3IgYmV0dGVyIHNtb290aGluZwogICAgICAgIHdoZW4g
cmVuZGVyaW5nIHRoZSBUZXh0dXJlUmVuZGVyZXIncyBjb250ZW50cyBhdCBhIGRpc3RhbmNlLgoK
ICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJh
bSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBhbnRpYWxpYXNlZCBmb250cwogICAgICAgIEBw
YXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQK
ICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJEIGxldmVsCiAgICAgICAgQHBhcmFtIHJlbmRl
ckRlbGVnYXRlIHRoZSByZW5kZXIgZGVsZWdhdGUgdG8gdXNlIHRvIGRyYXcgdGhlCiAgICAgICAg
dGV4dCdzIGJpdG1hcCwgb3IgbnVsbCB0byB1c2UgdGhlIGRlZmF1bHQgb25lCiAgICAgICAgQHBh
cmFtIG1pcG1hcCB3aGV0aGVyIHRvIGF0dGVtcHQgdXNlIG9mIGF1dG9tYXRpYyBtaXBtYXAgZ2Vu
ZXJhdGlvbgogICAgKi8KICAgIHB1YmxpYyBUZXh0UmVuZGVyZXIoRm9udCBmb250LCBib29sZWFu
IGFudGlhbGlhc2VkLAogICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUZyYWN0aW9u
YWxNZXRyaWNzLCBSZW5kZXJEZWxlZ2F0ZSByZW5kZXJEZWxlZ2F0ZSwKICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vbGVhbiBtaXBtYXApIHsKICAgICAgICB0aGlzLmZvbnQgPSBmb250OwogICAg
ICAgIHRoaXMuYW50aWFsaWFzZWQgPSBhbnRpYWxpYXNlZDsKICAgICAgICB0aGlzLnVzZUZyYWN0
aW9uYWxNZXRyaWNzID0gdXNlRnJhY3Rpb25hbE1ldHJpY3M7CiAgICAgICAgdGhpcy5taXBtYXAg
PSBtaXBtYXA7CgogICAgICAgIC8vIEZJWE1FOiBjb25zaWRlciBhZGp1c3RpbmcgdGhlIHNpemUg
YmFzZWQgb24gZm9udCBzaXplCiAgICAgICAgLy8gKGl0IHdpbGwgYWxyZWFkeSBhdXRvbWF0aWNh
bGx5IHJlc2l6ZSBpZiBuZWNlc3NhcnkpCiAgICAgICAgcGFja2VyID0gbmV3IFJlY3RhbmdsZVBh
Y2tlcihuZXcgTWFuYWdlcigpLCBrU2l6ZSwga1NpemUpOwoKICAgICAgICBpZiAocmVuZGVyRGVs
ZWdhdGUgPT0gbnVsbCkgewogICAgICAgICAgICByZW5kZXJEZWxlZ2F0ZSA9IG5ldyBEZWZhdWx0
UmVuZGVyRGVsZWdhdGUoKTsKICAgICAgICB9CgogICAgICAgIHRoaXMucmVuZGVyRGVsZWdhdGUg
PSByZW5kZXJEZWxlZ2F0ZTsKCiAgICAgICAgbUdseXBoUHJvZHVjZXIgPSBuZXcgR2x5cGhQcm9k
dWNlcihmb250LmdldE51bUdseXBocygpKTsKICAgIH0KCiAgICAvKiogUmV0dXJucyB0aGUgYm91
bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBnaXZlbiBTdHJpbmcsIGFzc3VtaW5nIGl0CiAgICAgICAg
d2FzIHJlbmRlcmVkIGF0IHRoZSBvcmlnaW4uIFNlZSB7QGxpbmsgI2dldEJvdW5kcyhDaGFyU2Vx
dWVuY2UpCiAgICAgICAgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSl9LiAqLwogICAgcHVibGljIFJl
Y3RhbmdsZTJEIGdldEJvdW5kcyhTdHJpbmcgc3RyKSB7CiAgICAgICAgcmV0dXJuIGdldEJvdW5k
cygoQ2hhclNlcXVlbmNlKSBzdHIpOwogICAgfQoKICAgIC8qKiBSZXR1cm5zIHRoZSBib3VuZGlu
ZyByZWN0YW5nbGUgb2YgdGhlIGdpdmVuIENoYXJTZXF1ZW5jZSwKICAgICAgICBhc3N1bWluZyBp
dCB3YXMgcmVuZGVyZWQgYXQgdGhlIG9yaWdpbi4gVGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mCiAg
ICAgICAgdGhlIHJldHVybmVkIHJlY3RhbmdsZSBpcyBKYXZhIDJEJ3MsIHdpdGggaW5jcmVhc2lu
ZyBZCiAgICAgICAgY29vcmRpbmF0ZXMgaW4gdGhlIGRvd253YXJkIGRpcmVjdGlvbi4gVGhlIHJl
bGF0aXZlIGNvb3JkaW5hdGUKICAgICAgICAoMCwgMCkgaW4gdGhlIHJldHVybmVkIHJlY3Rhbmds
ZSBjb3JyZXNwb25kcyB0byB0aGUgYmFzZWxpbmUgb2YKICAgICAgICB0aGUgbGVmdG1vc3QgY2hh
cmFjdGVyIG9mIHRoZSByZW5kZXJlZCBzdHJpbmcsIGluIHNpbWlsYXIKICAgICAgICBmYXNoaW9u
IHRvIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5LCBmb3IgZXhhbXBsZSwge0BsaW5rCiAgICAgICAg
amF2YS5hd3QuZm9udC5HbHlwaFZlY3RvciNnZXRWaXN1YWxCb3VuZHN9LiBNb3N0IGFwcGxpY2F0
aW9ucwogICAgICAgIHdpbGwgdXNlIG9ubHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHJl
dHVybmVkIFJlY3RhbmdsZSBmb3IKICAgICAgICB0aGUgcHVycG9zZXMgb2YgY2VudGVyaW5nIG9y
IGp1c3RpZnlpbmcgdGhlIFN0cmluZy4gSXQgaXMgbm90CiAgICAgICAgc3BlY2lmaWVkIHdoaWNo
IEphdmEgMkQgYm91bmRzICh7QGxpbmsKICAgICAgICBqYXZhLmF3dC5mb250LkdseXBoVmVjdG9y
I2dldFZpc3VhbEJvdW5kcyBnZXRWaXN1YWxCb3VuZHN9LAogICAgICAgIHtAbGluayBqYXZhLmF3
dC5mb250LkdseXBoVmVjdG9yI2dldFBpeGVsQm91bmRzIGdldFBpeGVsQm91bmRzfSwKICAgICAg
ICBldGMuKSB0aGUgcmV0dXJuZWQgYm91bmRzIGNvcnJlc3BvbmQgdG8sIGFsdGhvdWdoIGV2ZXJ5
IGVmZm9ydAogICAgICAgIGlzIG1hZGUgdG8gZW5zdXJlIGFuIGFjY3VyYXRlIGJvdW5kLiAqLwog
ICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kcyhDaGFyU2VxdWVuY2Ugc3RyKSB7CiAgICAg
ICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIG1vcmUgb3B0aW1pemVkIGFuZCB1c2UgdGhlIGds
eXBoIGNhY2hlCiAgICAgICAgUmVjdCByID0gbnVsbDsKCiAgICAgICAgaWYgKChyID0gKFJlY3Qp
IHN0cmluZ0xvY2F0aW9ucy5nZXQoc3RyKSkgIT0gbnVsbCkgewogICAgICAgICAgICBUZXh0RGF0
YSBkYXRhID0gKFRleHREYXRhKSByLmdldFVzZXJEYXRhKCk7CgogICAgICAgICAgICAvLyBSZWNv
bnN0aXR1dGUgdGhlIEphdmEgMkQgcmVzdWx0cyBiYXNlZCBvbiB0aGUgY2FjaGVkIHZhbHVlcwog
ICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZTJELkRvdWJsZSgtZGF0YS5vcmlnaW4oKS54
LCAtZGF0YS5vcmlnaW4oKS55LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByLncoKSwgci5oKCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gTXVzdCByZXR1cm4gYSBS
ZWN0YW5nbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBsYXlvdXQgYWxnb3JpdGhtIC0tCiAgICAgICAg
Ly8gbXVzdCBiZSBpZGVtcG90ZW50CiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShyZW5kZXJEZWxl
Z2F0ZS5nZXRCb3VuZHMoc3RyLCBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGdldEZvbnRSZW5kZXJDb250ZXh0KCkpKTsKICAgIH0KCiAgICAv
KiogUmV0dXJucyB0aGUgRm9udCB0aGlzIHJlbmRlcmVyIGlzIHVzaW5nLiAqLwogICAgcHVibGlj
IEZvbnQgZ2V0Rm9udCgpIHsKICAgICAgICByZXR1cm4gZm9udDsKICAgIH0KCiAgICAvKiogUmV0
dXJucyBhIEZvbnRSZW5kZXJDb250ZXh0IHdoaWNoIGNhbiBiZSB1c2VkIGZvciBleHRlcm5hbAog
ICAgICAgIHRleHQtcmVsYXRlZCBzaXplIGNvbXB1dGF0aW9ucy4gVGhpcyBvYmplY3Qgc2hvdWxk
IGJlIGNvbnNpZGVyZWQKICAgICAgICB0cmFuc2llbnQgYW5kIG1heSBiZWNvbWUgaW52YWxpZGF0
ZWQgYmV0d2VlbiB7QGxpbmsKICAgICAgICAjYmVnaW5SZW5kZXJpbmcgYmVnaW5SZW5kZXJpbmd9
IC8ge0BsaW5rICNlbmRSZW5kZXJpbmcKICAgICAgICBlbmRSZW5kZXJpbmd9IHBhaXJzLiAqLwog
ICAgcHVibGljIEZvbnRSZW5kZXJDb250ZXh0IGdldEZvbnRSZW5kZXJDb250ZXh0KCkgewogICAg
ICAgIGlmIChjYWNoZWRGb250UmVuZGVyQ29udGV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgIGNh
Y2hlZEZvbnRSZW5kZXJDb250ZXh0ID0gZ2V0R3JhcGhpY3MyRCgpLmdldEZvbnRSZW5kZXJDb250
ZXh0KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2FjaGVkRm9udFJlbmRlckNvbnRleHQ7
CiAgICB9CgogICAgLyoqIEJlZ2lucyByZW5kZXJpbmcgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVu
ZGVyZXIgVGV4dFJlbmRlcmVyfQogICAgICAgIGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdh
YmxlLCBwdXNoaW5nIHRoZSBwcm9qZWN0aW9uIGFuZAogICAgICAgIG1vZGVsdmlldyBtYXRyaWNl
cyBhbmQgc29tZSBzdGF0ZSBiaXRzIGFuZCBzZXR0aW5nIHVwIGEKICAgICAgICB0d28tZGltZW5z
aW9uYWwgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gd2l0aCAoMCwgMCkgYXMgdGhlCiAgICAgICAg
bG93ZXItbGVmdCBjb29yZGluYXRlIGFuZCAod2lkdGgsIGhlaWdodCkgYXMgdGhlIHVwcGVyLXJp
Z2h0CiAgICAgICAgY29vcmRpbmF0ZS4gQmluZHMgYW5kIGVuYWJsZXMgdGhlIGludGVybmFsIE9w
ZW5HTCB0ZXh0dXJlCiAgICAgICAgb2JqZWN0LCBzZXRzIHRoZSB0ZXh0dXJlIGVudmlyb25tZW50
IG1vZGUgdG8gR0xfTU9EVUxBVEUsIGFuZAogICAgICAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgY29s
b3IgdG8gdGhlIGxhc3QgY29sb3Igc2V0IHdpdGggdGhpcwogICAgICAgIFRleHRSZW5kZXJlciB2
aWEge0BsaW5rICNzZXRDb2xvciBzZXRDb2xvcn0uIFRoaXMgbWV0aG9kCiAgICAgICAgZGlzYWJs
ZXMgdGhlIGRlcHRoIHRlc3QgYW5kIGlzIGVxdWl2YWxlbnQgdG8KICAgICAgICBiZWdpblJlbmRl
cmluZyh3aWR0aCwgaGVpZ2h0LCB0cnVlKS4KCiAgICAgICAgQHBhcmFtIHdpZHRoIHRoZSB3aWR0
aCBvZiB0aGUgY3VycmVudCBvbi1zY3JlZW4gT3BlbkdMIGRyYXdhYmxlCiAgICAgICAgQHBhcmFt
IGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBjdXJyZW50IG9uLXNjcmVlbiBPcGVuR0wgZHJhd2Fi
bGUKICAgICAgICBAdGhyb3dzIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV4Y2VwdGlvbiBJZiBhbiBP
cGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAog
ICAgKi8KICAgIHB1YmxpYyB2b2lkIGJlZ2luUmVuZGVyaW5nKGludCB3aWR0aCwgaW50IGhlaWdo
dCkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBiZWdpblJlbmRlcmluZyh3aWR0aCwgaGVp
Z2h0LCB0cnVlKTsKICAgIH0KCiAgICAvKiogQmVnaW5zIHJlbmRlcmluZyB3aXRoIHRoaXMge0Bs
aW5rIFRleHRSZW5kZXJlciBUZXh0UmVuZGVyZXJ9CiAgICAgICAgaW50byB0aGUgY3VycmVudCBP
cGVuR0wgZHJhd2FibGUsIHB1c2hpbmcgdGhlIHByb2plY3Rpb24gYW5kCiAgICAgICAgbW9kZWx2
aWV3IG1hdHJpY2VzIGFuZCBzb21lIHN0YXRlIGJpdHMgYW5kIHNldHRpbmcgdXAgYQogICAgICAg
IHR3by1kaW1lbnNpb25hbCBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiB3aXRoICgwLCAwKSBhcyB0
aGUKICAgICAgICBsb3dlci1sZWZ0IGNvb3JkaW5hdGUgYW5kICh3aWR0aCwgaGVpZ2h0KSBhcyB0
aGUgdXBwZXItcmlnaHQKICAgICAgICBjb29yZGluYXRlLiBCaW5kcyBhbmQgZW5hYmxlcyB0aGUg
aW50ZXJuYWwgT3BlbkdMIHRleHR1cmUKICAgICAgICBvYmplY3QsIHNldHMgdGhlIHRleHR1cmUg
ZW52aXJvbm1lbnQgbW9kZSB0byBHTF9NT0RVTEFURSwgYW5kCiAgICAgICAgY2hhbmdlcyB0aGUg
Y3VycmVudCBjb2xvciB0byB0aGUgbGFzdCBjb2xvciBzZXQgd2l0aCB0aGlzCiAgICAgICAgVGV4
dFJlbmRlcmVyIHZpYSB7QGxpbmsgI3NldENvbG9yIHNldENvbG9yfS4gRGlzYWJsZXMgdGhlIGRl
cHRoCiAgICAgICAgdGVzdCBpZiB0aGUgZGlzYWJsZURlcHRoVGVzdCBhcmd1bWVudCBpcyB0cnVl
LgoKICAgICAgICBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBjdXJyZW50IG9uLXNjcmVl
biBPcGVuR0wgZHJhd2FibGUKICAgICAgICBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhl
IGN1cnJlbnQgb24tc2NyZWVuIE9wZW5HTCBkcmF3YWJsZQogICAgICAgIEBwYXJhbSBkaXNhYmxl
RGVwdGhUZXN0IHdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgZGVwdGggdGVzdAogICAgICAgIEB0aHJv
d3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBiZWdpblJlbmRlcmlu
ZyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gZGlzYWJsZURlcHRoVGVzdCkKICAgICAg
ICB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGJlZ2luUmVuZGVyaW5nKHRydWUsIHdpZHRo
LCBoZWlnaHQsIGRpc2FibGVEZXB0aFRlc3QpOwogICAgfQoKICAgIC8qKiBCZWdpbnMgcmVuZGVy
aW5nIG9mIDJEIHRleHQgaW4gM0Qgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIKICAgICAg
ICBUZXh0UmVuZGVyZXJ9IGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdhYmxlLiBBc3N1bWVz
IHRoZSBlbmQKICAgICAgICB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHVwIHRoZSBt
b2RlbHZpZXcgYW5kIHByb2plY3Rpb24KICAgICAgICBtYXRyaWNlcywgYW5kIHdpbGwgcmVuZGVy
IHRleHQgdXNpbmcgdGhlIHtAbGluayAjZHJhdzNEIGRyYXczRH0KICAgICAgICBtZXRob2QuIFRo
aXMgbWV0aG9kIHB1c2hlcyBzb21lIE9wZW5HTCBzdGF0ZSBiaXRzLCBiaW5kcyBhbmQKICAgICAg
ICBlbmFibGVzIHRoZSBpbnRlcm5hbCBPcGVuR0wgdGV4dHVyZSBvYmplY3QsIHNldHMgdGhlIHRl
eHR1cmUKICAgICAgICBlbnZpcm9ubWVudCBtb2RlIHRvIEdMX01PRFVMQVRFLCBhbmQgY2hhbmdl
cyB0aGUgY3VycmVudCBjb2xvcgogICAgICAgIHRvIHRoZSBsYXN0IGNvbG9yIHNldCB3aXRoIHRo
aXMgVGV4dFJlbmRlcmVyIHZpYSB7QGxpbmsKICAgICAgICAjc2V0Q29sb3Igc2V0Q29sb3J9LgoK
ICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBj
dXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQg
YmVnaW4zRFJlbmRlcmluZygpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgYmVnaW5SZW5k
ZXJpbmcoZmFsc2UsIDAsIDAsIGZhbHNlKTsKICAgIH0KCiAgICAvKiogQ2hhbmdlcyB0aGUgY3Vy
cmVudCBjb2xvciBvZiB0aGlzIFRleHRSZW5kZXJlciB0byB0aGUgc3VwcGxpZWQKICAgICAgICBv
bmUuIFRoZSBkZWZhdWx0IGNvbG9yIGlzIG9wYXF1ZSB3aGl0ZS4KCiAgICAgICAgQHBhcmFtIGNv
bG9yIHRoZSBuZXcgY29sb3IgdG8gdXNlIGZvciByZW5kZXJpbmcgdGV4dAogICAgICAgIEB0aHJv
d3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihDb2xv
ciBjb2xvcikgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBib29sZWFuIG5vTmVlZEZvckZs
dXNoID0gKGhhdmVDYWNoZWRDb2xvciAmJiAoY2FjaGVkQ29sb3IgIT0gbnVsbCkgJiYKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLmVxdWFscyhjYWNoZWRDb2xvcikpOwoK
ICAgICAgICBpZiAoIW5vTmVlZEZvckZsdXNoKSB7CiAgICAgICAgICAgIGZsdXNoR2x5cGhQaXBl
bGluZSgpOwogICAgICAgIH0KCiAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuc2V0Q29sb3IoY29s
b3IpOwogICAgICAgIGhhdmVDYWNoZWRDb2xvciA9IHRydWU7CiAgICAgICAgY2FjaGVkQ29sb3Ig
PSBjb2xvcjsKICAgIH0KCiAgICAvKiogQ2hhbmdlcyB0aGUgY3VycmVudCBjb2xvciBvZiB0aGlz
IFRleHRSZW5kZXJlciB0byB0aGUgc3VwcGxpZWQKICAgICAgICBvbmUsIHdoZXJlIGVhY2ggY29t
cG9uZW50IHJhbmdlcyBmcm9tIDAuMGYgLSAxLjBmLiBUaGUgYWxwaGEKICAgICAgICBjb21wb25l
bnQsIGlmIHVzZWQsIGRvZXMgbm90IG5lZWQgdG8gYmUgcHJlbXVsdGlwbGllZCBpbnRvIHRoZQog
ICAgICAgIGNvbG9yIGNoYW5uZWxzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBm
b3Ige0BsaW5rCiAgICAgICAgY29tLnN1bi5vcGVuZ2wudXRpbC50ZXh0dXJlLlRleHR1cmUgVGV4
dHVyZX0sIGFsdGhvdWdoCiAgICAgICAgcHJlbXVsdGlwbGllZCBjb2xvcnMgYXJlIHVzZWQgaW50
ZXJuYWxseS4gVGhlIGRlZmF1bHQgY29sb3IgaXMKICAgICAgICBvcGFxdWUgd2hpdGUuCgogICAg
ICAgIEBwYXJhbSByIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3IKICAgICAgICBA
cGFyYW0gZyB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3IKICAgICAgICBAcGFy
YW0gYiB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIG5ldyBjb2xvcgogICAgICAgIEBwYXJhbSBh
IHRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIG5ldyBjb2xvciwgMC4wZiA9IGNvbXBsZXRlbHkK
ICAgICAgICB0cmFuc3BhcmVudCwgMS4wZiA9IGNvbXBsZXRlbHkgb3BhcXVlCiAgICAgICAgQHRo
cm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVu
IHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZs
b2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCiAgICAgICAgdGhyb3dzIEdMRXhjZXB0
aW9uIHsKICAgICAgICBib29sZWFuIG5vTmVlZEZvckZsdXNoID0gKGhhdmVDYWNoZWRDb2xvciAm
JiAoY2FjaGVkQ29sb3IgPT0gbnVsbCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChyID09IGNhY2hlZFIpICYmIChnID09IGNhY2hlZEcpICYmIChiID09IGNhY2hlZEIpICYm
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSA9PSBjYWNoZWRBKSk7CgogICAg
ICAgIGlmICghbm9OZWVkRm9yRmx1c2gpIHsKICAgICAgICAgICAgZmx1c2hHbHlwaFBpcGVsaW5l
KCk7CiAgICAgICAgfQoKICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xvcihyLCBnLCBi
LCBhKTsKICAgICAgICBoYXZlQ2FjaGVkQ29sb3IgPSB0cnVlOwogICAgICAgIGNhY2hlZFIgPSBy
OwogICAgICAgIGNhY2hlZEcgPSBnOwogICAgICAgIGNhY2hlZEIgPSBiOwogICAgICAgIGNhY2hl
ZEEgPSBhOwogICAgICAgIGNhY2hlZENvbG9yID0gbnVsbDsKICAgIH0KCiAgICAvKiogRHJhd3Mg
dGhlIHN1cHBsaWVkIENoYXJTZXF1ZW5jZSBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiB1c2luZwog
ICAgICAgIHRoZSByZW5kZXJlcidzIGN1cnJlbnQgY29sb3IuIFRoZSBiYXNlbGluZSBvZiB0aGUg
bGVmdG1vc3QKICAgICAgICBjaGFyYWN0ZXIgaXMgYXQgcG9zaXRpb24gKHgsIHkpIHNwZWNpZmll
ZCBpbiBPcGVuR0wgY29vcmRpbmF0ZXMsCiAgICAgICAgd2hlcmUgdGhlIG9yaWdpbiBpcyBhdCB0
aGUgbG93ZXItbGVmdCBvZiB0aGUgZHJhd2FibGUgYW5kIHRoZSBZCiAgICAgICAgY29vcmRpbmF0
ZSBpbmNyZWFzZXMgaW4gdGhlIHVwd2FyZCBkaXJlY3Rpb24uCgogICAgICAgIEBwYXJhbSBzdHIg
dGhlIHN0cmluZyB0byBkcmF3CiAgICAgICAgQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBhdCB3
aGljaCB0byBkcmF3CiAgICAgICAgQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBhdCB3aGljaCB0
byBkcmF3CiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBp
cyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1Ymxp
YyB2b2lkIGRyYXcoQ2hhclNlcXVlbmNlIHN0ciwgaW50IHgsIGludCB5KSB0aHJvd3MgR0xFeGNl
cHRpb24gewogICAgICAgIGRyYXczRChzdHIsIHgsIHksIDAsIDEpOwogICAgfQoKICAgIC8qKiBE
cmF3cyB0aGUgc3VwcGxpZWQgU3RyaW5nIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIHVzaW5nIHRo
ZQogICAgICAgIHJlbmRlcmVyJ3MgY3VycmVudCBjb2xvci4gU2VlIHtAbGluayAjZHJhdyhDaGFy
U2VxdWVuY2UsIGludCwKICAgICAgICBpbnQpIGRyYXcoQ2hhclNlcXVlbmNlLCBpbnQsIGludCl9
LiAqLwogICAgcHVibGljIHZvaWQgZHJhdyhTdHJpbmcgc3RyLCBpbnQgeCwgaW50IHkpIHRocm93
cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgZHJhdzNEKHN0ciwgeCwgeSwgMCwgMSk7CiAgICB9Cgog
ICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBDaGFyU2VxdWVuY2UgYXQgdGhlIGRlc2lyZWQgM0Qg
bG9jYXRpb24gdXNpbmcKICAgICAgICB0aGUgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9yLiBUaGUg
YmFzZWxpbmUgb2YgdGhlIGxlZnRtb3N0CiAgICAgICAgY2hhcmFjdGVyIGlzIHBsYWNlZCBhdCBw
b3NpdGlvbiAoeCwgeSwgeikgaW4gdGhlIGN1cnJlbnQKICAgICAgICBjb29yZGluYXRlIHN5c3Rl
bS4KCiAgICAgICAgQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGRyYXcKICAgICAgICBAcGFyYW0g
eCB0aGUgeCBjb29yZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0geSB0aGUg
eSBjb29yZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0geiB0aGUgeiBjb29y
ZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0gc2NhbGVGYWN0b3IgYSB1bmlm
b3JtIHNjYWxlIGZhY3RvciBhcHBsaWVkIHRvIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBk
cmF3biByZWN0YW5nbGUKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBj
b250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwog
ICAgcHVibGljIHZvaWQgZHJhdzNEKENoYXJTZXF1ZW5jZSBzdHIsIGZsb2F0IHgsIGZsb2F0IHks
IGZsb2F0IHosCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAg
ICAgICBpbnRlcm5hbF9kcmF3M0Qoc3RyLCB4LCB5LCB6LCBzY2FsZUZhY3Rvcik7CiAgICB9Cgog
ICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBTdHJpbmcgYXQgdGhlIGRlc2lyZWQgM0QgbG9jYXRp
b24gdXNpbmcgdGhlCiAgICAgICAgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9yLiBTZWUge0BsaW5r
ICNkcmF3M0QoQ2hhclNlcXVlbmNlLAogICAgICAgIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0
KSBkcmF3M0QoQ2hhclNlcXVlbmNlLCBmbG9hdCwgZmxvYXQsCiAgICAgICAgZmxvYXQsIGZsb2F0
KX0uICovCiAgICBwdWJsaWMgdm9pZCBkcmF3M0QoU3RyaW5nIHN0ciwgZmxvYXQgeCwgZmxvYXQg
eSwgZmxvYXQgeiwgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAgICAgICBpbnRlcm5hbF9kcmF3M0Qo
c3RyLCB4LCB5LCB6LCBzY2FsZUZhY3Rvcik7CiAgICB9CgogICAgLyoqIFJldHVybnMgdGhlIHBp
eGVsIHdpZHRoIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIuICovCiAgICBwdWJsaWMgZmxvYXQgZ2V0
Q2hhcldpZHRoKGNoYXIgaW5DaGFyKSB7CiAgICAgICAgcmV0dXJuIG1HbHlwaFByb2R1Y2VyLmdl
dEdseXBoUGl4ZWxXaWR0aChpbkNoYXIpOwogICAgfQoKICAgIC8qKiBDYXVzZXMgdGhlIFRleHRS
ZW5kZXJlciB0byBmbHVzaCBhbnkgaW50ZXJuYWwgY2FjaGVzIGl0IG1heSBiZQogICAgICAgIG1h
aW50YWluaW5nIGFuZCBkcmF3IGl0cyByZW5kZXJpbmcgcmVzdWx0cyB0byB0aGUgc2NyZWVuLiBU
aGlzCiAgICAgICAgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBlYWNoIGNhbGwgdG8gZHJhdygpIGlm
IHlvdSBhcmUgc2V0dGluZwogICAgICAgIE9wZW5HTCBzdGF0ZSBzdWNoIGFzIHRoZSBtb2RlbHZp
ZXcgbWF0cml4IGJldHdlZW4gY2FsbHMgdG8KICAgICAgICBkcmF3KCkuICovCiAgICBwdWJsaWMg
dm9pZCBmbHVzaCgpIHsKICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUoKTsKICAgIH0KCiAgICAv
KiogRW5kcyBhIHJlbmRlciBjeWNsZSB3aXRoIHRoaXMge0BsaW5rIFRleHRSZW5kZXJlciBUZXh0
UmVuZGVyZXJ9LgogICAgICAgIFJlc3RvcmVzIHRoZSBwcm9qZWN0aW9uIGFuZCBtb2RlbHZpZXcg
bWF0cmljZXMgYXMgd2VsbCBhcwogICAgICAgIHNldmVyYWwgT3BlbkdMIHN0YXRlIGJpdHMuIFNo
b3VsZCBiZSBwYWlyZWQgd2l0aCB7QGxpbmsKICAgICAgICAjYmVnaW5SZW5kZXJpbmcgYmVnaW5S
ZW5kZXJpbmd9LgoKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250
ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAg
cHVibGljIHZvaWQgZW5kUmVuZGVyaW5nKCkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBl
bmRSZW5kZXJpbmcodHJ1ZSk7CiAgICB9CgogICAgLyoqIEVuZHMgYSAzRCByZW5kZXIgY3ljbGUg
d2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIgVGV4dFJlbmRlcmVyfS4KICAgICAgICBSZXN0
b3JlcyBzZXZlcmFsIE9wZW5HTCBzdGF0ZSBiaXRzLiBTaG91bGQgYmUgcGFpcmVkIHdpdGgge0Bs
aW5rCiAgICAgICAgI2JlZ2luM0RSZW5kZXJpbmcgYmVnaW4zRFJlbmRlcmluZ30uCgogICAgICAg
IEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQg
d2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBlbmQzRFJl
bmRlcmluZygpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgZW5kUmVuZGVyaW5nKGZhbHNl
KTsKICAgIH0KCiAgICAvKiogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyB0aGlzIFRleHRSZW5k
ZXJlciBpcyB1c2luZy4gSXQgaXMgbm90CiAgICAgICAgdmFsaWQgdG8gdXNlIHRoZSBUZXh0UmVu
ZGVyZXIgYWZ0ZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgoKICAgICAgICBAdGhyb3dzIEdMRXhj
ZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRo
b2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHRocm93cyBHTEV4
Y2VwdGlvbiB7CiAgICAgICAgcGFja2VyLmRpc3Bvc2UoKTsKICAgICAgICBwYWNrZXIgPSBudWxs
OwogICAgICAgIGNhY2hlZEJhY2tpbmdTdG9yZSA9IG51bGw7CiAgICAgICAgY2FjaGVkR3JhcGhp
Y3MgPSBudWxsOwogICAgICAgIGNhY2hlZEZvbnRSZW5kZXJDb250ZXh0ID0gbnVsbDsKCiAgICAg
ICAgaWYgKGRiZ0ZyYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgZGJnRnJhbWUuZGlzcG9zZSgp
OwogICAgICAgIH0KICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEludGVybmFscyBv
bmx5IGJlbG93IHRoaXMgcG9pbnQKICAgIC8vCgogICAgcHJpdmF0ZSBzdGF0aWMgUmVjdGFuZ2xl
MkQgcHJlTm9ybWFsaXplKFJlY3RhbmdsZTJEIHNyYykgewogICAgICAgIC8vIE5lZWQgdG8gcm91
bmQgdG8gaW50ZWdlciBjb29yZGluYXRlcwogICAgICAgIC8vIEFsc28gZ2l2ZSBvdXJzZWx2ZXMg
YSBsaXR0bGUgc2xvcCBhcm91bmQgdGhlIHJlcG9ydGVkCiAgICAgICAgLy8gYm91bmRzIG9mIGds
eXBocyBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgbmVpdGhlciB0aGUgdmlzdWFsCiAgICAgICAgLy8g
bm9yIHRoZSBwaXhlbCBib3VuZHMgd29ya3MgcGVyZmVjdGx5IHdlbGwKICAgICAgICBpbnQgbWlu
WCA9IChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblgoKSkgLSAxOwogICAgICAgIGludCBtaW5Z
ID0gKGludCkgTWF0aC5mbG9vcihzcmMuZ2V0TWluWSgpKSAtIDE7CiAgICAgICAgaW50IG1heFgg
PSAoaW50KSBNYXRoLmNlaWwoc3JjLmdldE1heFgoKSkgKyAxOwogICAgICAgIGludCBtYXhZID0g
KGludCkgTWF0aC5jZWlsKHNyYy5nZXRNYXhZKCkpICsgMTsKICAgICAgICByZXR1cm4gbmV3IFJl
Y3RhbmdsZTJELkRvdWJsZShtaW5YLCBtaW5ZLCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpOwog
ICAgfQoKCiAgICBwcml2YXRlIFJlY3RhbmdsZTJEIG5vcm1hbGl6ZShSZWN0YW5nbGUyRCBzcmMp
IHsKICAgICAgICAvLyBHaXZlIG91cnNlbHZlcyBhIGJvdW5kYXJ5IGFyb3VuZCBlYWNoIGVudGl0
eSBvbiB0aGUgYmFja2luZwogICAgICAgIC8vIHN0b3JlIGluIG9yZGVyIHRvIHByZXZlbnQgYmxl
ZWRpbmcgb2YgbmVhcmJ5IFN0cmluZ3MgZHVlIHRvCiAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3
ZSB1c2UgbGluZWFyIGZpbHRlcmluZwoKICAgICAgICAvLyBOT1RFIHRoYXQgdGhpcyBib3VuZGFy
eSBpcyBxdWl0ZSBoZXVyaXN0aWMgYW5kIGlzIHJlbGF0ZWQKICAgICAgICAvLyB0byBob3cgZmFy
IGF3YXkgaW4gM0Qgd2UgbWF5IHZpZXcgdGhlIHRleHQgLS0KICAgICAgICAvLyBoZXVyaXN0aWNh
bGx5LCAxLjUlIG9mIHRoZSBmb250J3MgaGVpZ2h0CiAgICAgICAgaW50IGJvdW5kYXJ5ID0gKGlu
dCkgTWF0aC5tYXgoMSwgMC4wMTUgKiBmb250LmdldFNpemUoKSk7CgogICAgICAgIHJldHVybiBu
ZXcgUmVjdGFuZ2xlMkQuRG91YmxlKChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblgoKSAtIGJv
dW5kYXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRo
LmZsb29yKHNyYy5nZXRNaW5ZKCkgLSBib3VuZGFyeSksCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKHNyYy5nZXRXaWR0aCgpICsgMiAqIGJvdW5k
YXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmNl
aWwoc3JjLmdldEhlaWdodCgpKSArIDIgKiBib3VuZGFyeSk7CiAgICB9CgogICAgcHJpdmF0ZSBU
ZXh0dXJlUmVuZGVyZXIgZ2V0QmFja2luZ1N0b3JlKCkgewogICAgICAgIFRleHR1cmVSZW5kZXJl
ciByZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIpIHBhY2tlci5nZXRCYWNraW5nU3RvcmUoKTsK
CiAgICAgICAgaWYgKHJlbmRlcmVyICE9IGNhY2hlZEJhY2tpbmdTdG9yZSkgewogICAgICAgICAg
ICAvLyBCYWNraW5nIHN0b3JlIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lOyBkaXNjYXJkIGFueSBj
YWNoZWQgR3JhcGhpY3MyRAogICAgICAgICAgICBpZiAoY2FjaGVkR3JhcGhpY3MgIT0gbnVsbCkg
ewogICAgICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3MuZGlzcG9zZSgpOwogICAgICAgICAgICAg
ICAgY2FjaGVkR3JhcGhpY3MgPSBudWxsOwogICAgICAgICAgICAgICAgY2FjaGVkRm9udFJlbmRl
ckNvbnRleHQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWNoZWRCYWNraW5n
U3RvcmUgPSByZW5kZXJlcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjYWNoZWRCYWNraW5n
U3RvcmU7CiAgICB9CgogICAgcHJpdmF0ZSBHcmFwaGljczJEIGdldEdyYXBoaWNzMkQoKSB7CiAg
ICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CgogICAg
ICAgIGlmIChjYWNoZWRHcmFwaGljcyA9PSBudWxsKSB7CiAgICAgICAgICAgIGNhY2hlZEdyYXBo
aWNzID0gcmVuZGVyZXIuY3JlYXRlR3JhcGhpY3MoKTsKCiAgICAgICAgICAgIC8vIFNldCB1cCBj
b21wb3NpdGUsIGZvbnQgYW5kIHJlbmRlcmluZyBoaW50cwogICAgICAgICAgICBjYWNoZWRHcmFw
aGljcy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuU3JjKTsKICAgICAgICAgICAgY2FjaGVk
R3JhcGhpY3Muc2V0Q29sb3IoQ29sb3IuV0hJVEUpOwogICAgICAgICAgICBjYWNoZWRHcmFwaGlj
cy5zZXRGb250KGZvbnQpOwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdI
aW50KFJlbmRlcmluZ0hpbnRzLktFWV9URVhUX0FOVElBTElBU0lORywKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW50aWFsaWFzZWQgPyBSZW5kZXJpbmdIaW50
cy5WQUxVRV9URVhUX0FOVElBTElBU19PTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICA6IFJlbmRlcmluZ0hpbnRzLlZBTFVFX1RFWFRfQU5USUFMSUFTX09GRikp
OwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hp
bnRzLktFWV9GUkFDVElPTkFMTUVUUklDUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodXNlRnJhY3Rpb25hbE1ldHJpY3MKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgPyBSZW5kZXJpbmdIaW50cy5WQUxVRV9GUkFDVElPTkFM
TUVUUklDU19PTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6
IFJlbmRlcmluZ0hpbnRzLlZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09GRikpOwogICAgICAgIH0K
CiAgICAgICAgcmV0dXJuIGNhY2hlZEdyYXBoaWNzOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBi
ZWdpblJlbmRlcmluZyhib29sZWFuIG9ydGhvLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlRGVwdGhUZXN0Rm9yT3J0
aG8pIHsKICAgICAgICBpZiAoREVCVUcgJiYgIWRlYnVnZ2VkKSB7CiAgICAgICAgICAgIGRlYnVn
KCk7CiAgICAgICAgfQoKICAgICAgICBpbkJlZ2luRW5kUGFpciA9IHRydWU7CiAgICAgICAgaXNP
cnRob01vZGUgPSBvcnRobzsKICAgICAgICBiZWdpblJlbmRlcmluZ1dpZHRoID0gd2lkdGg7CiAg
ICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgYmVnaW5SZW5kZXJp
bmdEZXB0aFRlc3REaXNhYmxlZCA9IGRpc2FibGVEZXB0aFRlc3RGb3JPcnRobzsKCiAgICAgICAg
aWYgKG9ydGhvKSB7CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmJlZ2luT3J0aG9SZW5k
ZXJpbmcod2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0Rm9yT3J0aG8pOwogICAgICAgIH0gZWxzZSB7
CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmJlZ2luM0RSZW5kZXJpbmcoKTsKICAgICAg
ICB9CgogICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwoKICAgICAgICAvLyBQdXNo
IGNsaWVudCBhdHRyaWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgog
ICAgICAgIGdsLmdsUHVzaENsaWVudEF0dHJpYigoaW50KSBHTC5HTF9BTExfQ0xJRU5UX0FUVFJJ
Ql9CSVRTKTsKCiAgICAgICAgaWYgKCFoYXZlTWF4U2l6ZSkgewogICAgICAgICAgICAvLyBRdWVy
eSBPcGVuR0wgZm9yIHRoZSBtYXhpbXVtIHRleHR1cmUgc2l6ZSBhbmQgc2V0IGl0IGluIHRoZQog
ICAgICAgICAgICAvLyBSZWN0YW5nbGVQYWNrZXIgdG8ga2VlcCBpdCBmcm9tIGV4cGFuZGluZyB0
b28gbGFyZ2UKICAgICAgICAgICAgaW50W10gc3ogPSBuZXcgaW50WzFdOwogICAgICAgICAgICBn
bC5nbEdldEludGVnZXJ2KEdMLkdMX01BWF9URVhUVVJFX1NJWkUsIHN6LCAwKTsKICAgICAgICAg
ICAgcGFja2VyLnNldE1heFNpemUoc3pbMF0sIHN6WzBdKTsKICAgICAgICAgICAgaGF2ZU1heFNp
emUgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5lZWRUb1Jlc2V0Q29sb3IgJiYgaGF2
ZUNhY2hlZENvbG9yKSB7CiAgICAgICAgICAgIGlmIChjYWNoZWRDb2xvciA9PSBudWxsKSB7CiAg
ICAgICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xvcihjYWNoZWRSLCBjYWNoZWRH
LCBjYWNoZWRCLCBjYWNoZWRBKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAg
IGdldEJhY2tpbmdTdG9yZSgpLnNldENvbG9yKGNhY2hlZENvbG9yKTsKICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgbmVlZFRvUmVzZXRDb2xvciA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAg
Ly8gRGlzYWJsZSBmdXR1cmUgYXR0ZW1wdHMgdG8gdXNlIG1pcG1hcHBpbmcgaWYgVGV4dHVyZVJl
bmRlcmVyCiAgICAgICAgLy8gZG9lc24ndCBzdXBwb3J0IGl0CiAgICAgICAgaWYgKG1pcG1hcCAm
JiAhZ2V0QmFja2luZ1N0b3JlKCkuaXNVc2luZ0F1dG9NaXBtYXBHZW5lcmF0aW9uKCkpIHsKICAg
ICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4o
IkRpc2FibGVkIG1pcG1hcHBpbmcgaW4gVGV4dFJlbmRlcmVyIik7CiAgICAgICAgICAgIH0KCiAg
ICAgICAgICAgIG1pcG1hcCA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAq
IGVtemljOiBoZXJlIHRoZSBjYWxsIHRvIGdsQmluZEJ1ZmZlciBjcmFzaGVzIG9uIGNlcnRhaW4g
Z3JhcGhpY3NjYXJkL2RyaXZlciBjb21iaW5hdGlvbnMKICAgICAqIHRoaXMgaXMgd2h5IHRoZSB1
Z2x5IHRyeS1jYXRjaCBibG9jayBoYXMgYmVlbiBhZGRlZCwgd2hpY2ggZmFsbHMgYmFjayB0byB0
aGUgb2xkIHRleHRyZW5kZXJlcgogICAgICogCiAgICAgKiBAcGFyYW0gb3J0aG8KICAgICAqIEB0
aHJvd3MgR0xFeGNlcHRpb24KICAgICAqLwogICAgcHJpdmF0ZSB2b2lkIGVuZFJlbmRlcmluZyhi
b29sZWFuIG9ydGhvKSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGZsdXNoR2x5cGhQaXBl
bGluZSgpOwoKICAgICAgICBpbkJlZ2luRW5kUGFpciA9IGZhbHNlOwoKICAgICAgICBHTCBnbCA9
IEdMVS5nZXRDdXJyZW50R0woKTsKCiAgICAgICAgLy8gUG9wIGNsaWVudCBhdHRyaWIgYml0cyB1
c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgogICAgICAgIGdsLmdsUG9wQ2xpZW50
QXR0cmliKCk7CgogICAgICAgIC8vIFRoZSBPcGVuR0wgc3BlYyBpcyB1bmNsZWFyIGFib3V0IHdo
ZXRoZXIgdGhpcyBjaGFuZ2VzIHRoZQogICAgICAgIC8vIGJ1ZmZlciBiaW5kaW5ncywgc28gcHJl
ZW1wdGl2ZWx5IHplcm8gb3V0IHRoZSBHTF9BUlJBWV9CVUZGRVIKICAgICAgICAvLyBiaW5kaW5n
CiAgICAgICAgaWYgKGlzVkJPQXZhaWxhYmxlKGdsKSkgewogICAgICAgICAgICB0cnkgewogICAg
ICAgICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7CiAgICAg
ICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBpc0V4dGVuc2lv
bkF2YWlsYWJsZV9WQk8gPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAg
aWYgKG9ydGhvKSB7CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmVuZE9ydGhvUmVuZGVy
aW5nKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuZW5k
M0RSZW5kZXJpbmcoKTsKICAgICAgICB9CgogICAgICAgIGlmICgrK251bVJlbmRlckN5Y2xlcyA+
PSBDWUNMRVNfUEVSX0ZMVVNIKSB7CiAgICAgICAgICAgIG51bVJlbmRlckN5Y2xlcyA9IDA7Cgog
ICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRs
bigiQ2xlYXJpbmcgdW51c2VkIGVudHJpZXMgaW4gZW5kUmVuZGVyaW5nKCkiKTsKICAgICAgICAg
ICAgfQoKICAgICAgICAgICAgY2xlYXJVbnVzZWRFbnRyaWVzKCk7CiAgICAgICAgfQogICAgfQoK
ICAgIHByaXZhdGUgdm9pZCBjbGVhclVudXNlZEVudHJpZXMoKSB7CiAgICAgICAgZmluYWwgamF2
YS51dGlsLkxpc3QgZGVhZFJlY3RzID0gbmV3IEFycmF5TGlzdCAvKjxSZWN0PiovKCk7CgogICAg
ICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY29udGVudHMgb2YgdGhlIGJhY2tpbmcgc3RvcmUs
IHJlbW92aW5nCiAgICAgICAgLy8gdGV4dCBzdHJpbmdzIHRoYXQgaGF2ZW4ndCBiZWVuIHVzZWQg
cmVjZW50bHkKICAgICAgICBwYWNrZXIudmlzaXQobmV3IFJlY3RWaXNpdG9yKCkgewogICAgICAg
ICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoUmVjdCByZWN0KSB7CiAgICAgICAgICAgICAgICAg
ICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwoKICAgICAg
ICAgICAgICAgICAgICBpZiAoZGF0YS51c2VkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAg
ZGF0YS5jbGVhclVzZWQoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAg
ICAgICAgICAgICAgICBkZWFkUmVjdHMuYWRkKHJlY3QpOwogICAgICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIGZvciAoSXRlcmF0b3Ig
aXRlciA9IGRlYWRSZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKICAgICAgICAg
ICAgUmVjdCByID0gKFJlY3QpIGl0ZXIubmV4dCgpOwogICAgICAgICAgICBwYWNrZXIucmVtb3Zl
KHIpOwogICAgICAgICAgICBzdHJpbmdMb2NhdGlvbnMucmVtb3ZlKCgoVGV4dERhdGEpIHIuZ2V0
VXNlckRhdGEoKSkuc3RyaW5nKCkpOwoKICAgICAgICAgICAgaW50IHVuaWNvZGVUb0NsZWFyRnJv
bUNhY2hlID0gKChUZXh0RGF0YSkgci5nZXRVc2VyRGF0YSgpKS51bmljb2RlSUQ7CgogICAgICAg
ICAgICBpZiAodW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUgPiAwKSB7CiAgICAgICAgICAgICAgICBt
R2x5cGhQcm9kdWNlci5jbGVhckNhY2hlRW50cnkodW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUpOwog
ICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAgICAgIGlmIChERUJVRykgewogICAgICAgICAg
ICAvLyAgICAgICAgR3JhcGhpY3MyRCBnID0gZ2V0R3JhcGhpY3MyRCgpOwogICAgICAgICAgICAv
LyAgICAgICAgZy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOwogICAgICAgICAg
ICAvLyAgICAgICAgZy5maWxsUmVjdChyLngoKSwgci55KCksIHIudygpLCByLmgoKSk7CiAgICAg
ICAgICAgIC8vICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0ZS5TcmMpOwogICAg
ICAgICAgICAvLyAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIElmIHdlIHJlbW92ZWQgZGVh
ZCByZWN0YW5nbGVzIHRoaXMgY3ljbGUsIHRyeSB0byBkbyBhIGNvbXBhY3Rpb24KICAgICAgICBm
bG9hdCBmcmFnID0gcGFja2VyLnZlcnRpY2FsRnJhZ21lbnRhdGlvblJhdGlvKCk7CgogICAgICAg
IGlmICghZGVhZFJlY3RzLmlzRW1wdHkoKSAmJiAoZnJhZyA+IE1BWF9WRVJUSUNBTF9GUkFHTUVO
VEFUSU9OKSkgewogICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3Rl
bS5lcnIucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFj
dGluZyBUZXh0UmVuZGVyZXIgYmFja2luZyBzdG9yZSBkdWUgdG8gdmVydGljYWwgZnJhZ21lbnRh
dGlvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnKTsKICAgICAg
ICAgICAgfQoKICAgICAgICAgICAgcGFja2VyLmNvbXBhY3QoKTsKICAgICAgICB9CgogICAgICAg
IGlmIChERUJVRykgewogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5tYXJrRGlydHkoMCwg
MCwgZ2V0QmFja2luZ1N0b3JlKCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmdldEhlaWdodCgpKTsKICAgICAgICB9
CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGludGVybmFsX2RyYXczRChDaGFyU2VxdWVuY2Ugc3Ry
LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmbG9hdCBzY2FsZUZhY3RvcikgewogICAgICAgIExpc3QvKjxHbHlwaD4qLyBnbHlwaHMg
PSBtR2x5cGhQcm9kdWNlci5nZXRHbHlwaHMoc3RyKTsKICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0
ZXIgPSBnbHlwaHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewogICAgICAgICAgICBH
bHlwaCBnbHlwaCA9IChHbHlwaCkgaXRlci5uZXh0KCk7CiAgICAgICAgICAgIGZsb2F0IGFkdmFu
Y2UgPSBnbHlwaC5kcmF3M0QoeCwgeSwgeiwgc2NhbGVGYWN0b3IpOwogICAgICAgICAgICB4ICs9
IGFkdmFuY2UgKiBzY2FsZUZhY3RvcjsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk
IGZsdXNoR2x5cGhQaXBlbGluZSgpIHsKICAgICAgICBpZiAobVBpcGVsaW5lZFF1YWRSZW5kZXJl
ciAhPSBudWxsKSB7CiAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZHJhdygpOwog
ICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgZHJhdzNEX1JPQlVTVChDaGFyU2VxdWVu
Y2Ugc3RyLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAgICAgICBTdHJpbmcgY3VyU3RyOwogICAg
ICAgIGlmIChzdHIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKICAgICAgICAgICAgY3VyU3RyID0gKFN0
cmluZykgc3RyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN1clN0ciA9IHN0ci50b1N0
cmluZygpOwogICAgICAgIH0KCiAgICAgICAgLy8gTG9vayB1cCB0aGUgc3RyaW5nIG9uIHRoZSBi
YWNraW5nIHN0b3JlCiAgICAgICAgUmVjdCByZWN0ID0gKFJlY3QpIHN0cmluZ0xvY2F0aW9ucy5n
ZXQoY3VyU3RyKTsKCiAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBS
YXN0ZXJpemUgdGhpcyBzdHJpbmcgYW5kIHBsYWNlIGl0IG9uIHRoZSBiYWNraW5nIHN0b3JlCiAg
ICAgICAgICAgIEdyYXBoaWNzMkQgZyA9IGdldEdyYXBoaWNzMkQoKTsKICAgICAgICAgICAgUmVj
dGFuZ2xlMkQgb3JpZ0JCb3ggPSBwcmVOb3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRz
KGN1clN0ciwgZm9udCwgZ2V0Rm9udFJlbmRlckNvbnRleHQoKSkpOwogICAgICAgICAgICBSZWN0
YW5nbGUyRCBiYm94ID0gbm9ybWFsaXplKG9yaWdCQm94KTsKICAgICAgICAgICAgUG9pbnQgb3Jp
Z2luID0gbmV3IFBvaW50KChpbnQpIC1iYm94LmdldE1pblgoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChpbnQpIC1iYm94LmdldE1pblkoKSk7CiAgICAgICAgICAgIHJl
Y3QgPSBuZXcgUmVjdCgwLCAwLCAoaW50KSBiYm94LmdldFdpZHRoKCksCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoaW50KSBiYm94LmdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3IFRleHREYXRhKGN1clN0ciwgb3JpZ2luLCBvcmlnQkJveCwgLTEpKTsKCiAg
ICAgICAgICAgIHBhY2tlci5hZGQocmVjdCk7CiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5w
dXQoY3VyU3RyLCByZWN0KTsKCiAgICAgICAgICAgIC8vIFJlLWZldGNoIHRoZSBHcmFwaGljczJE
IGluIGNhc2UgdGhlIGFkZGl0aW9uIG9mIHRoZSByZWN0YW5nbGUKICAgICAgICAgICAgLy8gY2F1
c2VkIHRoZSBvbGQgYmFja2luZyBzdG9yZSB0byBiZSB0aHJvd24gYXdheQogICAgICAgICAgICBn
ID0gZ2V0R3JhcGhpY3MyRCgpOwoKICAgICAgICAgICAgLy8gT0ssIHNob3VsZCBub3cgaGF2ZSBh
biAoeCwgeSkgZm9yIHRoaXMgcmVjdGFuZ2xlOyByYXN0ZXJpemUKICAgICAgICAgICAgLy8gdGhl
IFN0cmluZwogICAgICAgICAgICBpbnQgc3RyeCA9IHJlY3QueCgpICsgb3JpZ2luLng7CiAgICAg
ICAgICAgIGludCBzdHJ5ID0gcmVjdC55KCkgKyBvcmlnaW4ueTsKCiAgICAgICAgICAgIC8vIENs
ZWFyIG91dCB0aGUgYXJlYSB3ZSdyZSBnb2luZyB0byBkcmF3IGludG8KICAgICAgICAgICAgZy5z
ZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOwogICAgICAgICAgICBnLmZpbGxSZWN0
KHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53KCksIHJlY3QuaCgpKTsKICAgICAgICAgICAgZy5z
ZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuU3JjKTsKCiAgICAgICAgICAgIC8vIERyYXcgdGhl
IHN0cmluZwogICAgICAgICAgICByZW5kZXJEZWxlZ2F0ZS5kcmF3KGcsIGN1clN0ciwgc3RyeCwg
c3RyeSk7CgogICAgICAgICAgICBpZiAoRFJBV19CQk9YRVMpIHsKICAgICAgICAgICAgICAgIFRl
eHREYXRhIGRhdGEgPSAoVGV4dERhdGEpIHJlY3QuZ2V0VXNlckRhdGEoKTsKICAgICAgICAgICAg
ICAgIC8vIERyYXcgYSBib3VuZGluZyBib3ggb24gdGhlIGJhY2tpbmcgc3RvcmUKICAgICAgICAg
ICAgICAgIGcuZHJhd1JlY3Qoc3RyeCAtIGRhdGEub3JpZ09yaWdpblgoKSwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3RyeSAtIGRhdGEub3JpZ09yaWdpblkoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGludCkgZGF0YS5vcmlnUmVjdCgpLmdldFdpZHRoKCksCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChpbnQpIGRhdGEub3JpZ1JlY3QoKS5nZXRIZWlnaHQoKSk7CiAgICAg
ICAgICAgICAgICBnLmRyYXdSZWN0KHN0cnggLSBkYXRhLm9yaWdpbigpLngsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0cnkgLSBkYXRhLm9yaWdpbigpLnksCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlY3QudygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmgoKSk7
CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1hcmsgdGhpcyByZWdpb24gb2YgdGhlIFRl
eHR1cmVSZW5kZXJlciBhcyBkaXJ0eQogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5tYXJr
RGlydHkocmVjdC54KCksIHJlY3QueSgpLCByZWN0LncoKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICB9CgogICAgICAgIC8vIE9LLCBu
b3cgZHJhdyB0aGUgcG9ydGlvbiBvZiB0aGUgYmFja2luZyBzdG9yZSB0byB0aGUgc2NyZWVuCiAg
ICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CgogICAg
ICAgIC8vIE5PVEUgdGhhdCB0aGUgcmVjdGFuZ2xlcyBtYW5hZ2VkIGJ5IHRoZSBwYWNrZXIgaGF2
ZSB0aGVpcgogICAgICAgIC8vIG9yaWdpbiBhdCB0aGUgdXBwZXItbGVmdCBidXQgdGhlIFRleHR1
cmVSZW5kZXJlcidzIG9yaWdpbiBpcwogICAgICAgIC8vIGF0IGl0cyBsb3dlciBsZWZ0ISEhCiAg
ICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwogICAg
ICAgIGRhdGEubWFya1VzZWQoKTsKCiAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QgPSBkYXRh
Lm9yaWdSZWN0KCk7CiAgICAgICAgCiAgICAgICAgLy8gQWxpZ24gdGhlIGxlZnRtb3N0IHBvaW50
IG9mIHRoZSBiYXNlbGluZSB0byB0aGUgKHgsIHksIHopIGNvb3JkaW5hdGUgcmVxdWVzdGVkCiAg
ICAgICAgcmVuZGVyZXIuZHJhdzNEUmVjdCh4IC0gKHNjYWxlRmFjdG9yICogZGF0YS5vcmlnT3Jp
Z2luWCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLSAoc2NhbGVGYWN0b3IgKiAo
KGZsb2F0KSBvcmlnUmVjdC5nZXRIZWlnaHQoKSAtIGRhdGEub3JpZ09yaWdpblkoKSkpLCB6LAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC54KCkgKyAoZGF0YS5vcmlnaW4oKS54IC0g
ZGF0YS5vcmlnT3JpZ2luWCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVy
LmdldEhlaWdodCgpIC0gcmVjdC55KCkgLSAoaW50KSBvcmlnUmVjdC5nZXRIZWlnaHQoKSAtCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhLm9yaWdpbigpLnkgLSBkYXRhLm9yaWdP
cmlnaW5ZKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgb3JpZ1JlY3QuZ2V0
V2lkdGgoKSwgKGludCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCksIHNjYWxlRmFjdG9yKTsKICAgIH0K
CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIERlYnVnZ2luZyBmdW5jdGlvbmFsaXR5CiAgICAv
LwogICAgcHJpdmF0ZSB2b2lkIGRlYnVnKCkgewogICAgICAgIGRiZ0ZyYW1lID0gbmV3IEZyYW1l
KCJUZXh0UmVuZGVyZXIgRGVidWcgT3V0cHV0Iik7CgogICAgICAgIEdMQ2FudmFzIGRiZ0NhbnZh
cyA9IG5ldyBHTENhbnZhcyhuZXcgR0xDYXBhYmlsaXRpZXMoKSwgbnVsbCwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xDb250ZXh0LmdldEN1cnJlbnQoKSwgbnVs
bCk7CiAgICAgICAgZGJnQ2FudmFzLmFkZEdMRXZlbnRMaXN0ZW5lcihuZXcgRGVidWdMaXN0ZW5l
cihkYmdGcmFtZSkpOwogICAgICAgIGRiZ0ZyYW1lLmFkZChkYmdDYW52YXMpOwoKICAgICAgICBm
aW5hbCBGUFNBbmltYXRvciBhbmltID0gbmV3IEZQU0FuaW1hdG9yKGRiZ0NhbnZhcywgMTApOwog
ICAgICAgIGRiZ0ZyYW1lLmFkZFdpbmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkgewog
ICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7
CiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHRoaXMgb24gYW5vdGhlciB0aHJlYWQgdGhhbiB0
aGUgQVdUIGV2ZW50IHF1ZXVlIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRo
ZSBjYWxsIHRvIEFuaW1hdG9yLnN0b3AoKSBjb21wbGV0ZXMgYmVmb3JlCiAgICAgICAgICAgICAg
ICAgICAgLy8gZXhpdGluZwogICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5h
YmxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RvcCgpOwogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KS5zdGFydCgpOwogICAg
ICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICBkYmdGcmFtZS5zZXRTaXplKGtT
aXplLCBrU2l6ZSk7CiAgICAgICAgZGJnRnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKICAgICAgICBh
bmltLnN0YXJ0KCk7CiAgICAgICAgZGVidWdnZWQgPSB0cnVlOwogICAgfQoKICAgIC8qKiBDbGFz
cyBzdXBwb3J0aW5nIG1vcmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIHByb2Nlc3Mgb2YgcmVuZGVy
aW5nCiAgICAgICAgdGhlIGJpdG1hcHBlZCB0ZXh0LiBBbGxvd3MgY3VzdG9taXphdGlvbiBvZiB3
aGV0aGVyIHRoZSBiYWNraW5nCiAgICAgICAgc3RvcmUgdGV4dCBiaXRtYXAgaXMgZnVsbC1jb2xv
ciBvciBpbnRlbnNpdHkgb25seSwgdGhlIHNpemUgb2YKICAgICAgICBlYWNoIGluZGl2aWR1YWwg
cmVuZGVyZWQgdGV4dCByZWN0YW5nbGUsIGFuZCB0aGUgY29udGVudHMgb2YKICAgICAgICBlYWNo
IGluZGl2aWR1YWwgcmVuZGVyZWQgdGV4dCBzdHJpbmcuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0
aW9uCiAgICAgICAgb2YgdGhpcyBpbnRlcmZhY2UgdXNlcyBhbiBpbnRlbnNpdHktb25seSB0ZXh0
dXJlLCBhCiAgICAgICAgY2xvc2VseS1jcm9wcGVkIHJlY3RhbmdsZSBhcm91bmQgdGhlIHRleHQs
IGFuZCByZW5kZXJzIHRleHQKICAgICAgICB1c2luZyB0aGUgY29sb3Igd2hpdGUsIHdoaWNoIGlz
IG1vZHVsYXRlZCBieSB0aGUgc2V0IGNvbG9yCiAgICAgICAgZHVyaW5nIHRoZSByZW5kZXJpbmcg
cHJvY2Vzcy4gKi8KICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlbmRlckRlbGVnYXRlIHsK
ICAgICAgICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJhY2tpbmcgc3RvcmUgb2YgdGhpcyBU
ZXh0UmVuZGVyZXIKICAgICAgICAgICAgc2hvdWxkIGJlIGludGVuc2l0eS1vbmx5ICh0aGUgZGVm
YXVsdCkgb3IgZnVsbC1jb2xvci4gKi8KICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlbnNpdHlP
bmx5KCk7CgogICAgICAgIC8qKiBDb21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBTdHJp
bmcgcmVsYXRpdmUgdG8gdGhlCiAgICAgICAgICAgIG9yaWdpbi4gKi8KICAgICAgICBwdWJsaWMg
UmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKFN0cmluZyBzdHIsIEZvbnQgZm9udCwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7CgogICAgICAg
IC8qKiBDb21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc2VxdWVuY2Ug
cmVsYXRpdmUKICAgICAgICAgICAgdG8gdGhlIG9yaWdpbi4gKi8KICAgICAgICBwdWJsaWMgUmVj
dGFuZ2xlMkQgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7CgogICAg
ICAgIC8qKiBDb21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBHbHlwaFZlY3RvciwgYWxy
ZWFkeQogICAgICAgICAgICBhc3N1bWVkIHRvIGhhdmUgYmVlbiBjcmVhdGVkIGZvciBhIHBhcnRp
Y3VsYXIgRm9udCwKICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbi4gKi8KICAgICAg
ICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKEdseXBoVmVjdG9yIGd2LCBGb250UmVuZGVy
Q29udGV4dCBmcmMpOwoKICAgICAgICAvKiogUmVuZGVyIHRoZSBwYXNzZWQgY2hhcmFjdGVyIHNl
cXVlbmNlIGF0IHRoZSBkZXNpZ25hdGVkCiAgICAgICAgICAgIGxvY2F0aW9uIHVzaW5nIHRoZSBz
dXBwbGllZCBHcmFwaGljczJEIGluc3RhbmNlLiBUaGUKICAgICAgICAgICAgc3Vycm91bmRpbmcg
cmVnaW9uIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gY2xlYXJlZCB0byB0aGUgUkdCCiAgICAgICAg
ICAgIGNvbG9yICgwLCAwLCAwKSB3aXRoIHplcm8gYWxwaGEuIFRoZSBpbml0aWFsIGRyYXdpbmcg
Y29udGV4dAogICAgICAgICAgICBvZiB0aGUgcGFzc2VkIEdyYXBoaWNzMkQgd2lsbCBiZSBzZXQg
dG8gdXNlCiAgICAgICAgICAgIEFscGhhQ29tcG9zaXRlLlNyYywgdGhlIGNvbG9yIHdoaXRlLCB0
aGUgRm9udCBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgIFRleHRSZW5kZXJlcidzIGNvbnN0
cnVjdG9yLCBhbmQgdGhlIHJlbmRlcmluZyBoaW50cyBzcGVjaWZpZWQKICAgICAgICAgICAgaW4g
dGhlIFRleHRSZW5kZXJlciBjb25zdHJ1Y3Rvci4gIENoYW5nZXMgbWFkZSBieSB0aGUgZW5kIHVz
ZXIKICAgICAgICAgICAgbWF5IGJlIHZpc2libGUgaW4gc3VjY2Vzc2l2ZSBjYWxscyB0byB0aGlz
IG1ldGhvZCwgYnV0IGFyZSBub3QKICAgICAgICAgICAgZ3VhcmFudGVlZCB0byBiZSBwcmVzZXJ2
ZWQuICBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2QKICAgICAgICAgICAgc2hvdWxkIHJlc2V0
IHRoZSBHcmFwaGljczJEJ3Mgc3RhdGUgdG8gdGhhdCBkZXNpcmVkIGVhY2ggdGltZQogICAgICAg
ICAgICB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGluIHBhcnRpY3VsYXIgdGhvc2Ugc3RhdGVzIHdo
aWNoIGFyZQogICAgICAgICAgICBub3QgdGhlIGRlZmF1bHRzLiAqLwogICAgICAgIHB1YmxpYyB2
b2lkIGRyYXcoR3JhcGhpY3MyRCBncmFwaGljcywgU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KTsK
CiAgICAgICAgLyoqIFJlbmRlciB0aGUgcGFzc2VkIEdseXBoVmVjdG9yIGF0IHRoZSBkZXNpZ25h
dGVkIGxvY2F0aW9uIHVzaW5nCiAgICAgICAgICAgIHRoZSBzdXBwbGllZCBHcmFwaGljczJEIGlu
c3RhbmNlLiBUaGUgc3Vycm91bmRpbmcgcmVnaW9uIHdpbGwKICAgICAgICAgICAgYWxyZWFkeSBo
YXZlIGJlZW4gY2xlYXJlZCB0byB0aGUgUkdCIGNvbG9yICgwLCAwLCAwKSB3aXRoIHplcm8KICAg
ICAgICAgICAgYWxwaGEuIFRoZSBpbml0aWFsIGRyYXdpbmcgY29udGV4dCBvZiB0aGUgcGFzc2Vk
IEdyYXBoaWNzMkQKICAgICAgICAgICAgd2lsbCBiZSBzZXQgdG8gdXNlIEFscGhhQ29tcG9zaXRl
LlNyYywgdGhlIGNvbG9yIHdoaXRlLCB0aGUKICAgICAgICAgICAgRm9udCBzcGVjaWZpZWQgaW4g
dGhlIFRleHRSZW5kZXJlcidzIGNvbnN0cnVjdG9yLCBhbmQgdGhlCiAgICAgICAgICAgIHJlbmRl
cmluZyBoaW50cyBzcGVjaWZpZWQgaW4gdGhlIFRleHRSZW5kZXJlciBjb25zdHJ1Y3Rvci4KICAg
ICAgICAgICAgQ2hhbmdlcyBtYWRlIGJ5IHRoZSBlbmQgdXNlciBtYXkgYmUgdmlzaWJsZSBpbiBz
dWNjZXNzaXZlCiAgICAgICAgICAgIGNhbGxzIHRvIHRoaXMgbWV0aG9kLCBidXQgYXJlIG5vdCBn
dWFyYW50ZWVkIHRvIGJlIHByZXNlcnZlZC4KICAgICAgICAgICAgSW1wbGVtZW50b3JzIG9mIHRo
aXMgbWV0aG9kIHNob3VsZCByZXNldCB0aGUgR3JhcGhpY3MyRCdzCiAgICAgICAgICAgIHN0YXRl
IHRvIHRoYXQgZGVzaXJlZCBlYWNoIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpbgogICAg
ICAgICAgICBwYXJ0aWN1bGFyIHRob3NlIHN0YXRlcyB3aGljaCBhcmUgbm90IHRoZSBkZWZhdWx0
cy4gKi8KICAgICAgICBwdWJsaWMgdm9pZCBkcmF3R2x5cGhWZWN0b3IoR3JhcGhpY3MyRCBncmFw
aGljcywgR2x5cGhWZWN0b3Igc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpbnQgeCwgaW50IHkpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYXJTZXF1
ZW5jZUl0ZXJhdG9yIGltcGxlbWVudHMgQ2hhcmFjdGVySXRlcmF0b3IgewogICAgICAgIENoYXJT
ZXF1ZW5jZSBtU2VxdWVuY2U7CiAgICAgICAgaW50IG1MZW5ndGg7CiAgICAgICAgaW50IG1DdXJy
ZW50SW5kZXg7CgogICAgICAgIENoYXJTZXF1ZW5jZUl0ZXJhdG9yKCkgewogICAgICAgIH0KCiAg
ICAgICAgQ2hhclNlcXVlbmNlSXRlcmF0b3IoQ2hhclNlcXVlbmNlIHNlcXVlbmNlKSB7CiAgICAg
ICAgICAgIGluaXRGcm9tQ2hhclNlcXVlbmNlKHNlcXVlbmNlKTsKICAgICAgICB9CgogICAgICAg
IHB1YmxpYyB2b2lkIGluaXRGcm9tQ2hhclNlcXVlbmNlKENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSkg
ewogICAgICAgICAgICBtU2VxdWVuY2UgPSBzZXF1ZW5jZTsKICAgICAgICAgICAgbUxlbmd0aCA9
IG1TZXF1ZW5jZS5sZW5ndGgoKTsKICAgICAgICAgICAgbUN1cnJlbnRJbmRleCA9IDA7CiAgICAg
ICAgfQoKICAgICAgICBwdWJsaWMgY2hhciBsYXN0KCkgewogICAgICAgICAgICBtQ3VycmVudElu
ZGV4ID0gTWF0aC5tYXgoMCwgbUxlbmd0aCAtIDEpOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJl
bnQoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFyIGN1cnJlbnQoKSB7CiAgICAgICAg
ICAgIGlmICgobUxlbmd0aCA9PSAwKSB8fCAobUN1cnJlbnRJbmRleCA+PSBtTGVuZ3RoKSkgewog
ICAgICAgICAgICAgICAgcmV0dXJuIENoYXJhY3Rlckl0ZXJhdG9yLkRPTkU7CiAgICAgICAgICAg
IH0KCiAgICAgICAgICAgIHJldHVybiBtU2VxdWVuY2UuY2hhckF0KG1DdXJyZW50SW5kZXgpOwog
ICAgICAgIH0KCiAgICAgICAgcHVibGljIGNoYXIgbmV4dCgpIHsKICAgICAgICAgICAgbUN1cnJl
bnRJbmRleCsrOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQoKTsKICAgICAgICB9CgogICAg
ICAgIHB1YmxpYyBjaGFyIHByZXZpb3VzKCkgewogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0g
TWF0aC5tYXgobUN1cnJlbnRJbmRleCAtIDEsIDApOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJl
bnQoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFyIHNldEluZGV4KGludCBwb3NpdGlv
bikgewogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0gcG9zaXRpb247CgogICAgICAgICAgICBy
ZXR1cm4gY3VycmVudCgpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBnZXRCZWdpbklu
ZGV4KCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBp
bnQgZ2V0RW5kSW5kZXgoKSB7CiAgICAgICAgICAgIHJldHVybiBtTGVuZ3RoOwogICAgICAgIH0K
CiAgICAgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKICAgICAgICAgICAgcmV0dXJuIG1DdXJy
ZW50SW5kZXg7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAg
ICAgICAgICBDaGFyU2VxdWVuY2VJdGVyYXRvciBpdGVyID0gbmV3IENoYXJTZXF1ZW5jZUl0ZXJh
dG9yKG1TZXF1ZW5jZSk7CiAgICAgICAgICAgIGl0ZXIubUN1cnJlbnRJbmRleCA9IG1DdXJyZW50
SW5kZXg7CgogICAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9CgogICAgICAgIHB1Ymxp
YyBjaGFyIGZpcnN0KCkgewogICAgICAgICAgICBpZiAobUxlbmd0aCA9PSAwKSB7CiAgICAgICAg
ICAgICAgICByZXR1cm4gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORTsKICAgICAgICAgICAgfQoKICAg
ICAgICAgICAgbUN1cnJlbnRJbmRleCA9IDA7CgogICAgICAgICAgICByZXR1cm4gY3VycmVudCgp
OwogICAgICAgIH0KICAgIH0KCiAgICAvLyBEYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHJlY3Rh
bmdsZSBvZiB0ZXh0CiAgICBzdGF0aWMgY2xhc3MgVGV4dERhdGEgewogICAgICAgIC8vIEJhY2st
cG9pbnRlciB0byBTdHJpbmcgdGhpcyBUZXh0RGF0YSBkZXNjcmliZXMsIGlmIGl0CiAgICAgICAg
Ly8gcmVwcmVzZW50cyBhIFN0cmluZyByYXRoZXIgdGhhbiBhIHNpbmdsZSBnbHlwaAogICAgICAg
IHByaXZhdGUgU3RyaW5nIHN0cjsKCiAgICAgICAgLy8gSWYgdGhpcyBUZXh0RGF0YSByZXByZXNl
bnRzIGEgc2luZ2xlIGdseXBoLCB0aGlzIGlzIGl0cwogICAgICAgIC8vIHVuaWNvZGUgSUQKICAg
ICAgICBpbnQgdW5pY29kZUlEOwoKICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG11c3QgYmUgZGVm
aW5lZCBhbmQgdXNlZCBWRVJZIHByZWNpc2VseS4gVGhpcyBpcwogICAgICAgIC8vIHRoZSBvZmZz
ZXQgZnJvbSB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhpcyByZWN0YW5nbGUgKEphdmEKICAg
ICAgICAvLyAyRCBjb29yZGluYXRlIHN5c3RlbSkgYXQgd2hpY2ggdGhlIHN0cmluZyBtdXN0IGJl
IHJhc3Rlcml6ZWQgaW4KICAgICAgICAvLyBvcmRlciB0byBmaXQgd2l0aGluIHRoZSByZWN0YW5n
bGUgLS0gdGhlIGxlZnRtb3N0IHBvaW50IG9mIHRoZQogICAgICAgIC8vIGJhc2VsaW5lLgogICAg
ICAgIHByaXZhdGUgUG9pbnQgb3JpZ2luOwoKICAgICAgICAvLyBUaGlzIHJlcHJlc2VudHMgdGhl
IHByZS1ub3JtYWxpemVkIHJlY3RhbmdsZSwgd2hpY2ggZml0cwogICAgICAgIC8vIHdpdGhpbiB0
aGUgcmVjdGFuZ2xlIG9uIHRoZSBiYWNraW5nIHN0b3JlLiBXZSBrZWVwIGEKICAgICAgICAvLyBv
bmUtcGl4ZWwgYm9yZGVyIGFyb3VuZCBlbnRyaWVzIG9uIHRoZSBiYWNraW5nIHN0b3JlIHRvCiAg
ICAgICAgLy8gcHJldmVudCBibGVlZGluZyBvZiBhZGphY2VudCBsZXR0ZXJzIHdoZW4gdXNpbmcg
R0xfTElORUFSCiAgICAgICAgLy8gZmlsdGVyaW5nIGZvciByZW5kZXJpbmcuIFRoZSBvcmlnaW4g
b2YgdGhpcyByZWN0YW5nbGUgaXMKICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW4g
YWJvdmUuCiAgICAgICAgcHJpdmF0ZSBSZWN0YW5nbGUyRCBvcmlnUmVjdDsKCiAgICAgICAgcHJp
dmF0ZSBib29sZWFuIHVzZWQ7IC8vIFdoZXRoZXIgdGhpcyB0ZXh0IHdhcyB1c2VkIHJlY2VudGx5
CgogICAgICAgIFRleHREYXRhKFN0cmluZyBzdHIsIFBvaW50IG9yaWdpbiwgUmVjdGFuZ2xlMkQg
b3JpZ1JlY3QsIGludCB1bmljb2RlSUQpIHsKICAgICAgICAgICAgdGhpcy5zdHIgPSBzdHI7CiAg
ICAgICAgICAgIHRoaXMub3JpZ2luID0gb3JpZ2luOwogICAgICAgICAgICB0aGlzLm9yaWdSZWN0
ID0gb3JpZ1JlY3Q7CiAgICAgICAgICAgIHRoaXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAg
ICAgIH0KCiAgICAgICAgU3RyaW5nIHN0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cjsK
ICAgICAgICB9CgogICAgICAgIFBvaW50IG9yaWdpbigpIHsKICAgICAgICAgICAgcmV0dXJuIG9y
aWdpbjsKICAgICAgICB9CgogICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcyBh
cmUgdXNlZCB0byBsb2NhdGUgdGhlIGdseXBoCiAgICAgICAgLy8gd2l0aGluIHRoZSBleHBhbmRl
ZCByZWN0YW5nbGUgY29taW5nIGZyb20gbm9ybWFsaXplKCkKICAgICAgICBpbnQgb3JpZ09yaWdp
blgoKSB7CiAgICAgICAgICAgIHJldHVybiAoaW50KSAtb3JpZ1JlY3QuZ2V0TWluWCgpOwogICAg
ICAgIH0KCiAgICAgICAgaW50IG9yaWdPcmlnaW5ZKCkgewogICAgICAgICAgICByZXR1cm4gKGlu
dCkgLW9yaWdSZWN0LmdldE1pblkoKTsKICAgICAgICB9CgogICAgICAgIFJlY3RhbmdsZTJEIG9y
aWdSZWN0KCkgewogICAgICAgICAgICByZXR1cm4gb3JpZ1JlY3Q7CiAgICAgICAgfQoKICAgICAg
ICBib29sZWFuIHVzZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB1c2VkOwogICAgICAgIH0KCiAg
ICAgICAgdm9pZCBtYXJrVXNlZCgpIHsKICAgICAgICAgICAgdXNlZCA9IHRydWU7CiAgICAgICAg
fQoKICAgICAgICB2b2lkIGNsZWFyVXNlZCgpIHsKICAgICAgICAgICAgdXNlZCA9IGZhbHNlOwog
ICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBNYW5hZ2VyIGltcGxlbWVudHMgQmFja2luZ1N0b3Jl
TWFuYWdlciB7CiAgICAgICAgcHJpdmF0ZSBHcmFwaGljczJEIGc7CgogICAgICAgIHB1YmxpYyBP
YmplY3QgYWxsb2NhdGVCYWNraW5nU3RvcmUoaW50IHcsIGludCBoKSB7CiAgICAgICAgICAgIC8v
IEZJWE1FOiBzaG91bGQgY29uc2lkZXIgY2hlY2tpbmcgRm9udCdzIGF0dHJpYnV0ZXMgdG8gc2Vl
CiAgICAgICAgICAgIC8vIHdoZXRoZXIgd2UncmUgbGlrZWx5IHRvIG5lZWQgdG8gc3VwcG9ydCBh
IGZ1bGwgUkdCQSBiYWNraW5nCiAgICAgICAgICAgIC8vIHN0b3JlIChpLmUuLCBub24tZGVmYXVs
dCBQYWludCwgZm9yZWdyb3VuZCBjb2xvciwgZXRjLiksIGJ1dAogICAgICAgICAgICAvLyBmb3Ig
bm93LCBsZXQncyBqdXN0IGJlIG1vcmUgZWZmaWNpZW50CiAgICAgICAgICAgIFRleHR1cmVSZW5k
ZXJlciByZW5kZXJlcjsKCiAgICAgICAgICAgIGlmIChyZW5kZXJEZWxlZ2F0ZS5pbnRlbnNpdHlP
bmx5KCkpIHsKICAgICAgICAgICAgICAgIHJlbmRlcmVyID0gVGV4dHVyZVJlbmRlcmVyLmNyZWF0
ZUFscGhhT25seVJlbmRlcmVyKHcsIGgsIG1pcG1hcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAg
ICAgICAgICAgICAgICByZW5kZXJlciA9IG5ldyBUZXh0dXJlUmVuZGVyZXIodywgaCwgdHJ1ZSwg
bWlwbWFwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZW5kZXJlci5zZXRTbW9vdGhpbmco
c21vb3RoaW5nKTsKCiAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgU3lz
dGVtLmVyci5wcmludGxuKCIgVGV4dFJlbmRlcmVyIGFsbG9jYXRpbmcgYmFja2luZyBzdG9yZSAi
ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICsgIiB4ICIgKyBoKTsKICAg
ICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwogICAgICAgIH0KCiAgICAg
ICAgcHVibGljIHZvaWQgZGVsZXRlQmFja2luZ1N0b3JlKE9iamVjdCBiYWNraW5nU3RvcmUpIHsK
ICAgICAgICAgICAgKChUZXh0dXJlUmVuZGVyZXIpIGJhY2tpbmdTdG9yZSkuZGlzcG9zZSgpOwog
ICAgICAgIH0KCiAgICAgICAgcHVibGljIGJvb2xlYW4gcHJlRXhwYW5kKFJlY3QgY2F1c2UsIGlu
dCBhdHRlbXB0TnVtYmVyKSB7CiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRoaXMgb25lIHRpbWU7
IGNsZWFyIG91dCBwb3RlbnRpYWxseSBvYnNvbGV0ZSBlbnRyaWVzCiAgICAgICAgICAgIC8vIE5P
VEU6IHRoaXMgaGV1cmlzdGljIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGNsZWFycyB0aGUgdXNlZCBi
aXQKICAgICAgICAgICAgLy8gb2YgYWxsIGVudHJpZXMgc2VlbXMgdG8gY2F1c2UgY3ljbGluZyBv
ZiBlbnRyaWVzIGluIHNvbWUKICAgICAgICAgICAgLy8gc2l0dWF0aW9ucywgd2hlcmUgdGhlIGJh
Y2tpbmcgc3RvcmUgYmVjb21lcyBzbWFsbCBjb21wYXJlZCB0bwogICAgICAgICAgICAvLyB0aGUg
YW1vdW50IG9mIHRleHQgb24gdGhlIHNjcmVlbiAoc2VlIHRoZSBUZXh0RmxvdyBkZW1vKSBhbmQK
ICAgICAgICAgICAgLy8gdGhlIGVudHJpZXMgY29udGludWFsbHkgY3ljbGUgaW4gYW5kIG91dCBv
ZiB0aGUgYmFja2luZwogICAgICAgICAgICAvLyBzdG9yZSwgZGVjcmVhc2luZyBwZXJmb3JtYW5j
ZS4gSWYgd2UgYWRkZWQgYSBsaXR0bGUgYWdlCiAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIHRv
IHRoZSBlbnRyaWVzLCBhbmQgb25seSBjbGVhcmVkIG91dCBlbnRyaWVzCiAgICAgICAgICAgIC8v
IGFib3ZlIGEgY2VydGFpbiBhZ2UsIHRoaXMgYmVoYXZpb3Igd291bGQgYmUgZWxpbWluYXRlZC4K
ICAgICAgICAgICAgLy8gSG93ZXZlciwgaXQgc2VlbXMgdGhlIHN5c3RlbSB1c3VhbGx5IHN0YWJp
bGl6ZXMgaXRzZWxmLCBzbwogICAgICAgICAgICAvLyBmb3Igbm93IHdlJ2xsIGp1c3Qga2VlcCB0
aGluZ3Mgc2ltcGxlLiBOb3RlIHRoYXQgaWYgd2UgZG9uJ3QKICAgICAgICAgICAgLy8gY2xlYXIg
dGhlIHVzZWQgYml0IGhlcmUsIHRoZSBiYWNraW5nIHN0b3JlIHRlbmRzIHRvIGluY3JlYXNlCiAg
ICAgICAgICAgIC8vIHZlcnkgcXVpY2tseSB0byBpdHMgbWF4aW11bSBzaXplLCBhdCBsZWFzdCB3
aXRoIHRoZSBUZXh0RmxvdwogICAgICAgICAgICAvLyBkZW1vIHdoZW4gdGhlIHRleHQgaXMgYmVp
bmcgY29udGludWFsbHkgcmUtbGFpZCBvdXQuCiAgICAgICAgICAgIGlmIChhdHRlbXB0TnVtYmVy
ID09IDApIHsKICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAg
IFN5c3RlbS5lcnIucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgIkNsZWFyaW5nIHVu
dXNlZCBlbnRyaWVzIGluIHByZUV4cGFuZCgpOiBhdHRlbXB0IG51bWJlciAiICsKICAgICAgICAg
ICAgICAgICAgICAgICAgYXR0ZW1wdE51bWJlcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAg
ICAgICAgICAgaWYgKGluQmVnaW5FbmRQYWlyKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRHJh
dyBhbnkgb3V0c3RhbmRpbmcgZ2x5cGhzCiAgICAgICAgICAgICAgICAgICAgZmx1c2goKTsKICAg
ICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGVhclVudXNlZEVudHJpZXMoKTsKCiAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgYWRkaXRpb25GYWlsZWQo
UmVjdCBjYXVzZSwgaW50IGF0dGVtcHROdW1iZXIpIHsKICAgICAgICAgICAgLy8gSGVhdnkgaGFt
bWVyIC0tIG1pZ2h0IGNvbnNpZGVyIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnQKICAgICAgICAg
ICAgcGFja2VyLmNsZWFyKCk7CiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5jbGVhcigpOwog
ICAgICAgICAgICBtR2x5cGhQcm9kdWNlci5jbGVhckFsbENhY2hlRW50cmllcygpOwoKICAgICAg
ICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAqKiogQ2xlYXJlZCBhbGwgdGV4dCBi
ZWNhdXNlIGFkZGl0aW9uIGZhaWxlZCAqKioiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAg
ICAgICAgcHVibGljIHZvaWQgYmVnaW5Nb3ZlbWVudChPYmplY3Qgb2xkQmFja2luZ1N0b3JlLCBP
YmplY3QgbmV3QmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgIC8vIEV4aXQgdGhlIGJlZ2luIC8g
ZW5kIHBhaXIgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewog
ICAgICAgICAgICAgICAgLy8gRHJhdyBhbnkgb3V0c3RhbmRpbmcgZ2x5cGhzCiAgICAgICAgICAg
ICAgICBmbHVzaCgpOwoKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgp
OwoKICAgICAgICAgICAgICAgIC8vIFBvcCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUg
cGlwZWxpbmVkIHF1YWQgcmVuZGVyZXIKICAgICAgICAgICAgICAgIGdsLmdsUG9wQ2xpZW50QXR0
cmliKCk7CgogICAgICAgICAgICAgICAgLy8gVGhlIE9wZW5HTCBzcGVjIGlzIHVuY2xlYXIgYWJv
dXQgd2hldGhlciB0aGlzIGNoYW5nZXMgdGhlCiAgICAgICAgICAgICAgICAvLyBidWZmZXIgYmlu
ZGluZ3MsIHNvIHByZWVtcHRpdmVseSB6ZXJvIG91dCB0aGUgR0xfQVJSQVlfQlVGRkVSCiAgICAg
ICAgICAgICAgICAvLyBiaW5kaW5nCiAgICAgICAgICAgICAgICBpZiAoaXNWQk9BdmFpbGFibGUo
Z2wpKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAg
Z2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7CiAgICAgICAgICAgICAgICAg
ICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRl
bnNpb25BdmFpbGFibGVfVkJPID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpc09ydGhvTW9kZSkgewogICAgICAgICAg
ICAgICAgICAgICgoVGV4dHVyZVJlbmRlcmVyKSBvbGRCYWNraW5nU3RvcmUpLmVuZE9ydGhvUmVu
ZGVyaW5nKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICgo
VGV4dHVyZVJlbmRlcmVyKSBvbGRCYWNraW5nU3RvcmUpLmVuZDNEUmVuZGVyaW5nKCk7CiAgICAg
ICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBu
ZXdSZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZTsKICAgICAgICAg
ICAgZyA9IG5ld1JlbmRlcmVyLmNyZWF0ZUdyYXBoaWNzKCk7CiAgICAgICAgfQoKICAgICAgICBw
dWJsaWMgdm9pZCBtb3ZlKE9iamVjdCBvbGRCYWNraW5nU3RvcmUsIFJlY3Qgb2xkTG9jYXRpb24s
CiAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbmV3QmFja2luZ1N0b3JlLCBSZWN0IG5l
d0xvY2F0aW9uKSB7CiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBvbGRSZW5kZXJlciA9IChU
ZXh0dXJlUmVuZGVyZXIpIG9sZEJhY2tpbmdTdG9yZTsKICAgICAgICAgICAgVGV4dHVyZVJlbmRl
cmVyIG5ld1JlbmRlcmVyID0gKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlOwoKICAg
ICAgICAgICAgaWYgKG9sZFJlbmRlcmVyID09IG5ld1JlbmRlcmVyKSB7CiAgICAgICAgICAgICAg
ICAvLyBNb3ZlbWVudCBvbiB0aGUgc2FtZSBiYWNraW5nIHN0b3JlIC0tIGVhc3kgY2FzZQogICAg
ICAgICAgICAgICAgZy5jb3B5QXJlYShvbGRMb2NhdGlvbi54KCksIG9sZExvY2F0aW9uLnkoKSwg
b2xkTG9jYXRpb24udygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2NhdGlvbi5o
KCksIG5ld0xvY2F0aW9uLngoKSAtIG9sZExvY2F0aW9uLngoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3TG9jYXRpb24ueSgpIC0gb2xkTG9jYXRpb24ueSgpKTsKICAgICAgICAgICAg
fSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gZHJhdyBmcm9tIHRoZSBvbGQgcmVu
ZGVyZXIncyBpbWFnZSBpbnRvIHRoZSBuZXcgb25lCiAgICAgICAgICAgICAgICBJbWFnZSBpbWcg
PSBvbGRSZW5kZXJlci5nZXRJbWFnZSgpOwogICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1n
LCBuZXdMb2NhdGlvbi54KCksIG5ld0xvY2F0aW9uLnkoKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG5ld0xvY2F0aW9uLngoKSArIG5ld0xvY2F0aW9uLncoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG5ld0xvY2F0aW9uLnkoKSArIG5ld0xvY2F0aW9uLmgoKSwgb2xkTG9jYXRp
b24ueCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9jYXRpb24ueSgpLCBvbGRM
b2NhdGlvbi54KCkgKyBvbGRMb2NhdGlvbi53KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBvbGRMb2NhdGlvbi55KCkgKyBvbGRMb2NhdGlvbi5oKCksIG51bGwpOwogICAgICAgICAgICB9
CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBlbmRNb3ZlbWVudChPYmplY3Qgb2xkQmFj
a2luZ1N0b3JlLCBPYmplY3QgbmV3QmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgIGcuZGlzcG9z
ZSgpOwoKICAgICAgICAgICAgLy8gU3luYyB0aGUgd2hvbGUgc3VyZmFjZQogICAgICAgICAgICBU
ZXh0dXJlUmVuZGVyZXIgbmV3UmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBuZXdCYWNraW5n
U3RvcmU7CiAgICAgICAgICAgIG5ld1JlbmRlcmVyLm1hcmtEaXJ0eSgwLCAwLCBuZXdSZW5kZXJl
ci5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVuZGVy
ZXIuZ2V0SGVpZ2h0KCkpOwoKICAgICAgICAgICAgLy8gUmUtZW50ZXIgdGhlIGJlZ2luIC8gZW5k
IHBhaXIgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewogICAg
ICAgICAgICAgICAgaWYgKGlzT3J0aG9Nb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgKChUZXh0
dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZSkuYmVnaW5PcnRob1JlbmRlcmluZyhiZWdpblJl
bmRlcmluZ1dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQsIGJl
Z2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsK
ICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5i
ZWdpbjNEUmVuZGVyaW5nKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8g
UHVzaCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUgcGlwZWxpbmVkIHF1YWQgcmVuZGVy
ZXIKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwogICAgICAgICAg
ICAgICAgZ2wuZ2xQdXNoQ2xpZW50QXR0cmliKChpbnQpIEdMLkdMX0FMTF9DTElFTlRfQVRUUklC
X0JJVFMpOwoKICAgICAgICAgICAgICAgIGlmIChoYXZlQ2FjaGVkQ29sb3IpIHsKICAgICAgICAg
ICAgICAgICAgICBpZiAoY2FjaGVkQ29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAg
ICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRS
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjYWNoZWRHLCBjYWNoZWRCLCBjYWNoZWRBKTsKICAgICAgICAgICAgICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikg
bmV3QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRDb2xvcik7CiAgICAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAg
ICAgbmVlZFRvUmVzZXRDb2xvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9
CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0UmVuZGVyRGVsZWdhdGUgaW1wbGVtZW50
cyBSZW5kZXJEZWxlZ2F0ZSB7CiAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZW5zaXR5T25seSgp
IHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgUmVj
dGFuZ2xlMkQgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAg
ICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJT
ZXF1ZW5jZUl0ZXJhdG9yKHN0cikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYyk7
CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKFN0cmluZyBz
dHIsIEZvbnQgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRS
ZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3Jl
YXRlR2x5cGhWZWN0b3IoZnJjLCBzdHIpLCBmcmMpOwogICAgICAgIH0KCiAgICAgICAgcHVibGlj
IFJlY3RhbmdsZTJEIGdldEJvdW5kcyhHbHlwaFZlY3RvciBndiwgRm9udFJlbmRlckNvbnRleHQg
ZnJjKSB7CiAgICAgICAgICAgIHJldHVybiBndi5nZXRWaXN1YWxCb3VuZHMoKTsKICAgICAgICB9
CgogICAgICAgIHB1YmxpYyB2b2lkIGRyYXdHbHlwaFZlY3RvcihHcmFwaGljczJEIGdyYXBoaWNz
LCBHbHlwaFZlY3RvciBzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dCB4LCBpbnQgeSkgewogICAgICAgICAgICBncmFwaGljcy5kcmF3R2x5cGhWZWN0b3Ioc3RyLCB4
LCB5KTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3MyRCBncmFw
aGljcywgU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KSB7CiAgICAgICAgICAgIGdyYXBoaWNzLmRy
YXdTdHJpbmcoc3RyLCB4LCB5KTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CiAgICAvLyBHbHlwaC1ieS1nbHlwaCByZW5kZXJpbmcgc3VwcG9ydAogICAgLy8KCiAgICAvLyBB
IHRlbXBvcmFyeSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBnYXJiYWdlIGNyZWF0aW9uCiAgICBwcml2
YXRlIGNoYXJbXSBzaW5nbGVVbmljb2RlID0gbmV3IGNoYXJbMV07CgogICAgLyoqIEEgR2x5cGgg
cmVwcmVzZW50cyBlaXRoZXIgYSBzaW5nbGUgdW5pY29kZSBnbHlwaCBvciBhCiAgICAgICAgc3Vi
c3RyaW5nIG9mIGNoYXJhY3RlcnMgdG8gYmUgZHJhd24uIFRoZSByZWFzb24gZm9yIHRoZSBkdWFs
CiAgICAgICAgYmVoYXZpb3IgaXMgc28gdGhhdCB3ZSBjYW4gdGFrZSBpbiBhIHNlcXVlbmNlIG9m
IHVuaWNvZGUKICAgICAgICBjaGFyYWN0ZXJzIGFuZCBwYXJ0aXRpb24gdGhlbSBpbnRvIHJ1bnMg
b2YgaW5kaXZpZHVhbCBnbHlwaHMsCiAgICAgICAgYnV0IGlmIHdlIGVuY291bnRlciBjb21wbGV4
IHRleHQgYW5kL29yIHVuaWNvZGUgc2VxdWVuY2VzIHdlCiAgICAgICAgZG9uJ3QgdW5kZXJzdGFu
ZCwgd2UgY2FuIHJlbmRlciB0aGVtIHVzaW5nIHRoZQogICAgICAgIHN0cmluZy1ieS1zdHJpbmcg
bWV0aG9kLiA8UD4KCiAgICAgICAgR2x5cGhzIG5lZWQgdG8gYmUgYWJsZSB0byByZS11cGxvYWQg
dGhlbXNlbHZlcyB0byB0aGUgYmFja2luZwogICAgICAgIHN0b3JlIG9uIGRlbWFuZCBhcyB3ZSBn
byBhbG9uZyBpbiB0aGUgcmVuZGVyIHNlcXVlbmNlLgogICAgKi8KCiAgICBjbGFzcyBHbHlwaCB7
CiAgICAgICAgLy8gSWYgdGhpcyBHbHlwaCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdW5pY29k
ZSBnbHlwaCwgdGhpcwogICAgICAgIC8vIGlzIGl0cyB1bmljb2RlIElELiBJZiBpdCByZXByZXNl
bnRzIGEgU3RyaW5nLCB0aGlzIGlzIC0xLgogICAgICAgIHByaXZhdGUgaW50IHVuaWNvZGVJRDsK
ICAgICAgICAvLyBJZiB0aGUgYWJvdmUgZmllbGQgaXNuJ3QgLTEsIHRoZW4gdGhlc2UgZmllbGRz
IGFyZSB1c2VkLgogICAgICAgIC8vIFRoZSBnbHlwaCBjb2RlIGluIHRoZSBmb250CiAgICAgICAg
cHJpdmF0ZSBpbnQgZ2x5cGhDb2RlOwogICAgICAgIC8vIFRoZSBHbHlwaFByb2R1Y2VyIHdoaWNo
IGNyZWF0ZWQgdXMKICAgICAgICBwcml2YXRlIEdseXBoUHJvZHVjZXIgcHJvZHVjZXI7CiAgICAg
ICAgLy8gVGhlIGFkdmFuY2Ugb2YgdGhpcyBnbHlwaAogICAgICAgIHByaXZhdGUgZmxvYXQgYWR2
YW5jZTsKICAgICAgICAvLyBUaGUgR2x5cGhWZWN0b3IgZm9yIHRoaXMgc2luZ2xlIGNoYXJhY3Rl
cjsgdGhpcyBpcyBwYXNzZWQKICAgICAgICAvLyBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGJ1dCBj
bGVhcmVkIGR1cmluZyB0aGUgdXBsb2FkCiAgICAgICAgLy8gcHJvY2VzcwogICAgICAgIHByaXZh
dGUgR2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUdseXBoVmVjdG9yOwogICAgICAgIC8vIFRoZSBy
ZWN0YW5nbGUgb2YgdGhpcyBnbHlwaCBvbiB0aGUgYmFja2luZyBzdG9yZSwgb3IgbnVsbAogICAg
ICAgIC8vIGlmIGl0IGhhcyBiZWVuIGNsZWFyZWQgZHVlIHRvIHNwYWNlIHByZXNzdXJlCiAgICAg
ICAgcHJpdmF0ZSBSZWN0IGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nOwogICAgICAgIC8vIElm
IHRoaXMgR2x5cGggcmVwcmVzZW50cyBhIFN0cmluZywgdGhpcyBpcyB0aGUgc2VxdWVuY2Ugb2YK
ICAgICAgICAvLyBjaGFyYWN0ZXJzCiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyOwogICAgICAg
IC8vIFdoZXRoZXIgd2UgbmVlZCBhIHZhbGlkIGFkdmFuY2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBz
dHJpbmcKICAgICAgICAvLyAoaS5lLiwgd2hldGhlciBpdCBoYXMgb3RoZXIgc2luZ2xlIGdseXBo
cyBjb21pbmcgYWZ0ZXIgaXQpCiAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRBZHZhbmNlOwoK
ICAgICAgICAvLyBDcmVhdGVzIGEgR2x5cGggcmVwcmVzZW50aW5nIGFuIGluZGl2aWR1YWwgVW5p
Y29kZSBjaGFyYWN0ZXIKICAgICAgICBwdWJsaWMgR2x5cGgoaW50IHVuaWNvZGVJRCwKICAgICAg
ICAgICAgICAgICAgICAgaW50IGdseXBoQ29kZSwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQg
YWR2YW5jZSwKICAgICAgICAgICAgICAgICAgICAgR2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUds
eXBoVmVjdG9yLAogICAgICAgICAgICAgICAgICAgICBHbHlwaFByb2R1Y2VyIHByb2R1Y2VyKSB7
CiAgICAgICAgICAgIHRoaXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAgICAgICAgICB0aGlz
LmdseXBoQ29kZSA9IGdseXBoQ29kZTsKICAgICAgICAgICAgdGhpcy5hZHZhbmNlID0gYWR2YW5j
ZTsKICAgICAgICAgICAgdGhpcy5zaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IgPSBzaW5nbGVVbmlj
b2RlR2x5cGhWZWN0b3I7CiAgICAgICAgICAgIHRoaXMucHJvZHVjZXIgPSBwcm9kdWNlcjsKICAg
ICAgICB9CgogICAgICAgIC8vIENyZWF0ZXMgYSBHbHlwaCByZXByZXNlbnRpbmcgYSBzZXF1ZW5j
ZSBvZiBjaGFyYWN0ZXJzLCB3aXRoCiAgICAgICAgLy8gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVy
IGFkZGl0aW9uYWwgc2luZ2xlIGdseXBocyBhcmUgYmVpbmcKICAgICAgICAvLyByZW5kZXJlZCBh
ZnRlciBpdAogICAgICAgIHB1YmxpYyBHbHlwaChTdHJpbmcgc3RyLCBib29sZWFuIG5lZWRBZHZh
bmNlKSB7CiAgICAgICAgICAgIHRoaXMuc3RyID0gc3RyOwogICAgICAgICAgICB0aGlzLm5lZWRB
ZHZhbmNlID0gbmVlZEFkdmFuY2U7CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGlz
IGdseXBoJ3MgdW5pY29kZSBJRCAqLwogICAgICAgIHB1YmxpYyBpbnQgZ2V0VW5pY29kZUlEKCkg
ewogICAgICAgICAgICByZXR1cm4gdW5pY29kZUlEOwogICAgICAgIH0KCiAgICAgICAgLyoqIFJl
dHVybnMgdGhpcyBnbHlwaCdzIChmb250LXNwZWNpZmljKSBnbHlwaCBjb2RlICovCiAgICAgICAg
cHVibGljIGludCBnZXRHbHlwaENvZGUoKSB7CiAgICAgICAgICAgIHJldHVybiBnbHlwaENvZGU7
CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGUgYWR2YW5jZSBmb3IgdGhpcyBnbHlw
aCAqLwogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRBZHZhbmNlKCkgewogICAgICAgICAgICByZXR1
cm4gYWR2YW5jZTsKICAgICAgICB9CgogICAgICAgIC8qKiBEcmF3cyB0aGlzIGdseXBoIGFuZCBy
ZXR1cm5zIHRoZSAoeCkgYWR2YW5jZSBmb3IgdGhpcyBnbHlwaCAqLwogICAgICAgIHB1YmxpYyBm
bG9hdCBkcmF3M0QoZmxvYXQgaW5YLCBmbG9hdCBpblksIGZsb2F0IHosIGZsb2F0IHNjYWxlRmFj
dG9yKSB7CiAgICAgICAgICAgIGlmIChzdHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgZHJh
dzNEX1JPQlVTVChzdHIsIGluWCwgaW5ZLCB6LCBzY2FsZUZhY3Rvcik7CiAgICAgICAgICAgICAg
ICBpZiAoIW5lZWRBZHZhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAg
ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGFk
dmFuY2UgZm9yIHRoaXMgc3RyaW5nCiAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBndiA9IGZv
bnQuY3JlYXRlR2x5cGhWZWN0b3IoZ2V0Rm9udFJlbmRlckNvbnRleHQoKSwgc3RyKTsKICAgICAg
ICAgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IGd2LmdldE51bUdseXBocygpOyBpKyspIHsKICAgICAgICAgICAgICAgICAg
ICB0b3RhbEFkdmFuY2UgKz0gZ3YuZ2V0R2x5cGhNZXRyaWNzKGkpLmdldEFkdmFuY2UoKTsKICAg
ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CiAgICAg
ICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNvZGUgcGF0aCB0YWtlbiBmb3Ig
aW5kaXZpZHVhbCBnbHlwaHMKICAgICAgICAgICAgaWYgKGdseXBoUmVjdEZvclRleHR1cmVNYXBw
aW5nID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHVwbG9hZCgpOwogICAgICAgICAgICB9Cgog
ICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKG1QaXBlbGluZWRRdWFkUmVuZGVy
ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIg
PSBuZXcgUGlwZWxpbmVkX1F1YWRSZW5kZXJlcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAg
ICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdTdG9yZSgpOwog
ICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBjYXNlIHdoZXJlIE5QT1QgdGV4dHVyZSBpcyB1c2Vk
IGZvciBiYWNraW5nIHN0b3JlCiAgICAgICAgICAgICAgICBUZXh0dXJlQ29vcmRzIHdob2xlSW1h
Z2VUZXhDb29yZHMgPSByZW5kZXJlci5nZXRUZXh0dXJlKCkuZ2V0SW1hZ2VUZXhDb29yZHMoKTsK
ICAgICAgICAgICAgICAgIGZsb2F0IHhTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMucmlnaHQo
KTsKICAgICAgICAgICAgICAgIGZsb2F0IHlTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMuYm90
dG9tKCk7CgogICAgICAgICAgICAgICAgUmVjdCByZWN0ID0gZ2x5cGhSZWN0Rm9yVGV4dHVyZU1h
cHBpbmc7CiAgICAgICAgICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRleHREYXRhKSByZWN0Lmdl
dFVzZXJEYXRhKCk7CiAgICAgICAgICAgICAgICBkYXRhLm1hcmtVc2VkKCk7CgogICAgICAgICAg
ICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QgPSBkYXRhLm9yaWdSZWN0KCk7CgogICAgICAgICAg
ICAgICAgZmxvYXQgeCA9IGluWCAtIChzY2FsZUZhY3RvciAqIGRhdGEub3JpZ09yaWdpblgoKSk7
CiAgICAgICAgICAgICAgICBmbG9hdCB5ID0gaW5ZIC0gKHNjYWxlRmFjdG9yICogKChmbG9hdCkg
b3JpZ1JlY3QuZ2V0SGVpZ2h0KCkgLSBkYXRhLm9yaWdPcmlnaW5ZKCkpKTsKCiAgICAgICAgICAg
ICAgICBpbnQgdGV4dHVyZXggPSByZWN0LngoKSArIChkYXRhLm9yaWdpbigpLnggLSBkYXRhLm9y
aWdPcmlnaW5YKCkpOwogICAgICAgICAgICAgICAgaW50IHRleHR1cmV5ID0gcmVuZGVyZXIuZ2V0
SGVpZ2h0KCkgLSByZWN0LnkoKSAtIChpbnQpIG9yaWdSZWN0LmdldEhlaWdodCgpIC0KICAgICAg
ICAgICAgICAgICAgICAoZGF0YS5vcmlnaW4oKS55IC0gZGF0YS5vcmlnT3JpZ2luWSgpKTsKICAg
ICAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIG9yaWdSZWN0LmdldFdpZHRoKCk7CiAgICAg
ICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCk7CgogICAg
ICAgICAgICAgICAgZmxvYXQgdHgxID0geFNjYWxlICogKGZsb2F0KSB0ZXh0dXJleCAvIChmbG9h
dCkgcmVuZGVyZXIuZ2V0V2lkdGgoKTsKICAgICAgICAgICAgICAgIGZsb2F0IHR5MSA9IHlTY2Fs
ZSAqICgxLjBmIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsb2F0
KSB0ZXh0dXJleSAvIChmbG9hdCkgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkpKTsKICAgICAgICAgICAg
ICAgIGZsb2F0IHR4MiA9IHhTY2FsZSAqIChmbG9hdCkgKHRleHR1cmV4ICsgd2lkdGgpIC8gKGZs
b2F0KSByZW5kZXJlci5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgZmxvYXQgdHkyID0geVNj
YWxlICogKDEuMGYgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxv
YXQpICh0ZXh0dXJleSArIGhlaWdodCkgLyAoZmxvYXQpIHJlbmRlcmVyLmdldEhlaWdodCgpKSk7
CgogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENvb3JkMmYodHgx
LCB0eTEpOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFZlcnRleDNm
KHgsIHksIHopOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENv
b3JkMmYodHgyLCB0eTEpOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5n
bFZlcnRleDNmKHggKyAod2lkdGggKiBzY2FsZUZhY3RvciksIHksCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeik7CiAgICAgICAgICAgICAgICBtUGlw
ZWxpbmVkUXVhZFJlbmRlcmVyLmdsVGV4Q29vcmQyZih0eDIsIHR5Mik7CiAgICAgICAgICAgICAg
ICBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyLmdsVmVydGV4M2YoeCArICh3aWR0aCAqIHNjYWxlRmFj
dG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5
ICsgKGhlaWdodCAqIHNjYWxlRmFjdG9yKSwgeik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVk
UXVhZFJlbmRlcmVyLmdsVGV4Q29vcmQyZih0eDEsIHR5Mik7CiAgICAgICAgICAgICAgICBtUGlw
ZWxpbmVkUXVhZFJlbmRlcmVyLmdsVmVydGV4M2YoeCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsgKGhlaWdodCAqIHNjYWxlRmFjdG9yKSwgeik7
CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBlLnBy
aW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhZHZhbmNl
OwogICAgICAgIH0KCiAgICAgICAgLyoqIE5vdGlmaWVzIHRoaXMgZ2x5cGggdGhhdCBpdCdzIGJl
ZW4gY2xlYXJlZCBvdXQgb2YgdGhlIGNhY2hlICovCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXIo
KSB7CiAgICAgICAgICAgIGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nID0gbnVsbDsKICAgICAg
ICB9CgogICAgICAgIHByaXZhdGUgdm9pZCB1cGxvYWQoKSB7CiAgICAgICAgICAgIEdseXBoVmVj
dG9yIGd2ID0gZ2V0R2x5cGhWZWN0b3IoKTsKICAgICAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ0JC
b3ggPSBwcmVOb3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKGd2LCBnZXRGb250UmVu
ZGVyQ29udGV4dCgpKSk7CiAgICAgICAgICAgIFJlY3RhbmdsZTJEIGJib3ggPSBub3JtYWxpemUo
b3JpZ0JCb3gpOwogICAgICAgICAgICBQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQoKGludCkgLWJi
b3guZ2V0TWluWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkg
LWJib3guZ2V0TWluWSgpKTsKICAgICAgICAgICAgUmVjdCByZWN0ID0gbmV3IFJlY3QoMCwgMCwg
KGludCkgYmJveC5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
aW50KSBiYm94LmdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
ZXcgVGV4dERhdGEobnVsbCwgb3JpZ2luLCBvcmlnQkJveCwgdW5pY29kZUlEKSk7CiAgICAgICAg
ICAgIHBhY2tlci5hZGQocmVjdCk7CiAgICAgICAgICAgIGdseXBoUmVjdEZvclRleHR1cmVNYXBw
aW5nID0gcmVjdDsKICAgICAgICAgICAgR3JhcGhpY3MyRCBnID0gZ2V0R3JhcGhpY3MyRCgpOwog
ICAgICAgICAgICAvLyBPSywgc2hvdWxkIG5vdyBoYXZlIGFuICh4LCB5KSBmb3IgdGhpcyByZWN0
YW5nbGU7IHJhc3Rlcml6ZQogICAgICAgICAgICAvLyB0aGUgZ2x5cGgKICAgICAgICAgICAgaW50
IHN0cnggPSByZWN0LngoKSArIG9yaWdpbi54OwogICAgICAgICAgICBpbnQgc3RyeSA9IHJlY3Qu
eSgpICsgb3JpZ2luLnk7CgogICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGFyZWEgd2UncmUg
Z29pbmcgdG8gZHJhdyBpbnRvCiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9z
aXRlLkNsZWFyKTsKICAgICAgICAgICAgZy5maWxsUmVjdChyZWN0LngoKSwgcmVjdC55KCksIHJl
Y3QudygpLCByZWN0LmgoKSk7CiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9z
aXRlLlNyYyk7CgogICAgICAgICAgICAvLyBEcmF3IHRoZSBzdHJpbmcKICAgICAgICAgICAgcmVu
ZGVyRGVsZWdhdGUuZHJhd0dseXBoVmVjdG9yKGcsIGd2LCBzdHJ4LCBzdHJ5KTsKCiAgICAgICAg
ICAgIGlmIChEUkFXX0JCT1hFUykgewogICAgICAgICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChU
ZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwogICAgICAgICAgICAgICAgLy8gRHJhdyBhIGJv
dW5kaW5nIGJveCBvbiB0aGUgYmFja2luZyBzdG9yZQogICAgICAgICAgICAgICAgZy5kcmF3UmVj
dChzdHJ4IC0gZGF0YS5vcmlnT3JpZ2luWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBz
dHJ5IC0gZGF0YS5vcmlnT3JpZ2luWSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50
KSBkYXRhLm9yaWdSZWN0KCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGludCkgZGF0YS5vcmlnUmVjdCgpLmdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgIGcuZHJh
d1JlY3Qoc3RyeCAtIGRhdGEub3JpZ2luKCkueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RyeSAtIGRhdGEub3JpZ2luKCkueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53
KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgLy8gTWFyayB0aGlzIHJlZ2lvbiBvZiB0aGUgVGV4dHVyZVJlbmRlcmVyIGFz
IGRpcnR5CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eShyZWN0LngoKSwg
cmVjdC55KCksIHJlY3QudygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmVjdC5oKCkpOwogICAgICAgICAgICAvLyBSZS1yZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCBv
dXIgcHJvZHVjZXIKICAgICAgICAgICAgcHJvZHVjZXIucmVnaXN0ZXIodGhpcyk7CiAgICAgICAg
fQoKICAgICAgICBwcml2YXRlIEdseXBoVmVjdG9yIGdldEdseXBoVmVjdG9yKCkgewogICAgICAg
ICAgICBHbHlwaFZlY3RvciBndiA9IHNpbmdsZVVuaWNvZGVHbHlwaFZlY3RvcjsKICAgICAgICAg
ICAgaWYgKGd2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHNpbmdsZVVuaWNvZGVHbHlwaFZl
Y3RvciA9IG51bGw7IC8vIERvbid0IG5lZWQgdGhpcyBhbnltb3JlCiAgICAgICAgICAgICAgICBy
ZXR1cm4gZ3Y7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IChj
aGFyKSB1bmljb2RlSUQ7CiAgICAgICAgICAgIHJldHVybiBmb250LmNyZWF0ZUdseXBoVmVjdG9y
KGdldEZvbnRSZW5kZXJDb250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgIH0KICAgIH0K
CiAgICBjbGFzcyBHbHlwaFByb2R1Y2VyIHsKICAgICAgICBmaW5hbCBpbnQgdW5kZWZpbmVkID0g
LTI7CiAgICAgICAgRm9udFJlbmRlckNvbnRleHQgZm9udFJlbmRlckNvbnRleHQ7CiAgICAgICAg
TGlzdC8qPEdseXBoPiovIGdseXBoc091dHB1dCA9IG5ldyBBcnJheUxpc3QvKjxHbHlwaD4qLygp
OwogICAgICAgIC8vIFRoZSBtYXBwaW5nIGZyb20gdW5pY29kZSBjaGFyYWN0ZXIgdG8gZm9udC1z
cGVjaWZpYyBnbHlwaCBJRAogICAgICAgIGludFtdIHVuaWNvZGVzMkdseXBoczsKICAgICAgICAv
LyBUaGUgbWFwcGluZyBmcm9tIGdseXBoIElEIHRvIEdseXBoCiAgICAgICAgR2x5cGhbXSBnbHlw
aENhY2hlOwogICAgICAgIC8vIFdlIHJlLXVzZSB0aGlzIGZvciBlYWNoIGluY29taW5nIHN0cmlu
ZwogICAgICAgIENoYXJTZXF1ZW5jZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQ2hhclNlcXVlbmNlSXRl
cmF0b3IoKTsKCiAgICAgICAgR2x5cGhQcm9kdWNlcihpbnQgZm9udExlbmd0aEluR2x5cGhzKSB7
CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBocyA9IG5ldyBpbnRbNTEyXTsKICAgICAgICAgICAg
Z2x5cGhDYWNoZSA9IG5ldyBHbHlwaFtmb250TGVuZ3RoSW5HbHlwaHNdOwogICAgICAgICAgICBj
bGVhckFsbENhY2hlRW50cmllcygpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExpc3QvKjxH
bHlwaD4qLyBnZXRHbHlwaHMoQ2hhclNlcXVlbmNlIGluU3RyaW5nKSB7CiAgICAgICAgICAgIGds
eXBoc091dHB1dC5jbGVhcigpOwogICAgICAgICAgICBpdGVyLmluaXRGcm9tQ2hhclNlcXVlbmNl
KGluU3RyaW5nKTsKICAgICAgICAgICAgR2x5cGhWZWN0b3IgZnVsbFJ1bkdseXBoVmVjdG9yID0g
Zm9udC5jcmVhdGVHbHlwaFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGl0ZXIpOwogICAgICAgICAgICBib29sZWFuIGNvbXBsZXggPSAoZnVsbFJ1bkdseXBoVmVjdG9y
LmdldExheW91dEZsYWdzKCkgIT0gMCk7CiAgICAgICAgICAgIGlmIChjb21wbGV4IHx8IERJU0FC
TEVfR0xZUEhfQ0FDSEUpIHsKICAgICAgICAgICAgICAgIC8vIFB1bnQgdG8gdGhlIHJvYnVzdCB2
ZXJzaW9uIG9mIHRoZSByZW5kZXJlcgogICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFkZChu
ZXcgR2x5cGgoaW5TdHJpbmcudG9TdHJpbmcoKSwgZmFsc2UpKTsKICAgICAgICAgICAgICAgIHJl
dHVybiBnbHlwaHNPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBsZW5ndGhJ
bkdseXBocyA9IGZ1bGxSdW5HbHlwaFZlY3Rvci5nZXROdW1HbHlwaHMoKTsKICAgICAgICAgICAg
aW50IGkgPSAwOwogICAgICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aEluR2x5cGhzKSB7CiAgICAg
ICAgICAgICAgICBHbHlwaCBnbHlwaCA9IGdldEdseXBoKGluU3RyaW5nLCBmdWxsUnVuR2x5cGhW
ZWN0b3IsIGkpOwogICAgICAgICAgICAgICAgaWYgKGdseXBoICE9IG51bGwpIHsKICAgICAgICAg
ICAgICAgICAgICBnbHlwaHNPdXRwdXQuYWRkKGdseXBoKTsKICAgICAgICAgICAgICAgICAgICBp
Kys7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEFzc2Vt
YmxlIGEgcnVuIG9mIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBmaXQgaW4KICAgICAgICAgICAgICAg
ICAgICAvLyB0aGUgY2FjaGUKICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0g
bmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3Ro
SW5HbHlwaHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R2x5cGgoaW5TdHJpbmcs
IGZ1bGxSdW5HbHlwaFZlY3RvciwgaSkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAg
ICBidWYuYXBwZW5kKGluU3RyaW5nLmNoYXJBdChpKyspKTsKICAgICAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFkZChuZXcgR2x5cGgoYnVmLnRvU3Ry
aW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
QW55IG1vcmUgZ2x5cGhzIGFmdGVyIHRoaXMgcnVuPwogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGkgPCBsZW5ndGhJbkdseXBocykpOwogICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBnbHlwaHNPdXRwdXQ7CiAgICAg
ICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBjbGVhckNhY2hlRW50cnkoaW50IHVuaWNvZGVJRCkg
ewogICAgICAgICAgICBpbnQgZ2x5cGhJRCA9IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwog
ICAgICAgICAgICBpZiAoZ2x5cGhJRCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIEds
eXBoIGdseXBoID0gZ2x5cGhDYWNoZVtnbHlwaElEXTsKICAgICAgICAgICAgICAgIGlmIChnbHlw
aCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZ2x5cGguY2xlYXIoKTsKICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgICAgIGdseXBoQ2FjaGVbZ2x5cGhJRF0gPSBudWxsOwogICAg
ICAgICAgICB9CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdID0gdW5kZWZp
bmVkOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBbGxDYWNoZUVudHJpZXMo
KSB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pY29kZXMyR2x5cGhzLmxlbmd0
aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjbGVhckNhY2hlRW50cnkoaSk7CiAgICAgICAgICAg
IH0KICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEdseXBoIGdseXBoKSB7
CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1tnbHlwaC5nZXRVbmljb2RlSUQoKV0gPSBnbHlw
aC5nZXRHbHlwaENvZGUoKTsKICAgICAgICAgICAgZ2x5cGhDYWNoZVtnbHlwaC5nZXRHbHlwaENv
ZGUoKV0gPSBnbHlwaDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRHbHlwaFBp
eGVsV2lkdGgoY2hhciB1bmljb2RlSUQpIHsKICAgICAgICAgICAgR2x5cGggZ2x5cGggPSBnZXRH
bHlwaCh1bmljb2RlSUQpOwogICAgICAgICAgICBpZiAoZ2x5cGggIT0gbnVsbCkgewogICAgICAg
ICAgICAgICAgcmV0dXJuIGdseXBoLmdldEFkdmFuY2UoKTsKICAgICAgICAgICAgfQoKICAgICAg
ICAgICAgLy8gSGF2ZSB0byBkbyB0aGlzIHRoZSBoYXJkIC8gdW5jYWNoZWQgd2F5CiAgICAgICAg
ICAgIHNpbmdsZVVuaWNvZGVbMF0gPSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9y
IGd2ID0gZm9udC5jcmVhdGVHbHlwaFZlY3Rvcihmb250UmVuZGVyQ29udGV4dCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzaW5nbGVVbmljb2RlKTsKICAgICAgICAgICAgcmV0dXJuIGd2LmdldEdseXBoTWV0cmljcygw
KS5nZXRBZHZhbmNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm5zIGEgZ2x5cGggb2Jq
ZWN0IGZvciB0aGlzIHNpbmdsZSBnbHlwaC4gUmV0dXJucyBudWxsCiAgICAgICAgLy8gaWYgdGhl
IHVuaWNvZGUgb3IgZ2x5cGggSUQgd291bGQgYmUgb3V0IG9mIGJvdW5kcyBvZiB0aGUKICAgICAg
ICAvLyBnbHlwaCBjYWNoZS4KICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKENoYXJTZXF1
ZW5jZSBpblN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoVmVjdG9y
IGZ1bGxSdW5HbHlwaFZlY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBp
bmRleCkgewogICAgICAgICAgICBjaGFyIHVuaWNvZGVJRCA9IGluU3RyaW5nLmNoYXJBdChpbmRl
eCk7CgogICAgICAgICAgICBpZiAodW5pY29kZUlEID49IHVuaWNvZGVzMkdseXBocy5sZW5ndGgp
IHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAg
ICBpbnQgZ2x5cGhJRCA9IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwogICAgICAgICAgICBp
ZiAoZ2x5cGhJRCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnbHlwaENh
Y2hlW2dseXBoSURdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNdXN0IGZhYnJpY2F0
ZSB0aGUgZ2x5cGgKICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IHVuaWNvZGVJRDsKICAg
ICAgICAgICAgR2x5cGhWZWN0b3IgZ3YgPSBmb250LmNyZWF0ZUdseXBoVmVjdG9yKGdldEZvbnRS
ZW5kZXJDb250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgICAgICByZXR1cm4gZ2V0R2x5
cGgodW5pY29kZUlELCBndiwgZnVsbFJ1bkdseXBoVmVjdG9yLmdldEdseXBoTWV0cmljcyhpbmRl
eCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gSXQncyB1bmNsZWFyIHdoZXRoZXIgdGhpcyB2YXJp
YW50IG1pZ2h0IHByb2R1Y2UgbGVzcwogICAgICAgIC8vIG9wdGltYWwgcmVzdWx0cyB0aGFuIGlm
IHdlIGNhbiBzZWUgdGhlIGVudGlyZSBHbHlwaFZlY3RvcgogICAgICAgIC8vIGZvciB0aGUgaW5j
b21pbmcgc3RyaW5nCiAgICAgICAgcHJpdmF0ZSBHbHlwaCBnZXRHbHlwaChpbnQgdW5pY29kZUlE
KSB7CiAgICAgICAgICAgIGlmICh1bmljb2RlSUQgPj0gdW5pY29kZXMyR2x5cGhzLmxlbmd0aCkg
ewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAg
IGludCBnbHlwaElEID0gdW5pY29kZXMyR2x5cGhzW3VuaWNvZGVJRF07CiAgICAgICAgICAgIGlm
IChnbHlwaElEICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGdseXBoQ2Fj
aGVbZ2x5cGhJRF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9
IChjaGFyKSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZm9udC5jcmVh
dGVHbHlwaFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLCBzaW5nbGVVbmljb2RlKTsKICAg
ICAgICAgICAgcmV0dXJuIGdldEdseXBoKHVuaWNvZGVJRCwgZ3YsIGd2LmdldEdseXBoTWV0cmlj
cygwKSk7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKGludCB1bmlj
b2RlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBzaW5nbGVV
bmljb2RlR2x5cGhWZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaE1l
dHJpY3MgbWV0cmljcykgewogICAgICAgICAgICBpbnQgZ2x5cGhDb2RlID0gc2luZ2xlVW5pY29k
ZUdseXBoVmVjdG9yLmdldEdseXBoQ29kZSgwKTsKICAgICAgICAgICAgLy8gSGF2ZSBzZWVuIGh1
Z2UgZ2x5cGggY29kZXMgKDY1NTM2KSBjb21pbmcgb3V0IG9mIHNvbWUgZm9udHMgaW4gc29tZSBV
bmljb2RlIHNpdHVhdGlvbnMKICAgICAgICAgICAgaWYgKGdseXBoQ29kZSA+PSBnbHlwaENhY2hl
Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAg
ICAgICAgICAgR2x5cGggZ2x5cGggPSBuZXcgR2x5cGgodW5pY29kZUlELAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBnbHlwaENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1ldHJpY3MuZ2V0QWR2YW5jZSgpLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHRoaXMpOwogICAgICAgICAgICByZWdpc3RlcihnbHlwaCk7CiAg
ICAgICAgICAgIHJldHVybiBnbHlwaDsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgUGlwZWxp
bmVkX1F1YWRSZW5kZXJlciB7CiAgICAgICAgaW50IG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2Vz
UGlwZWxpbmUgPSAwOwogICAgICAgIEZsb2F0QnVmZmVyIG1UZXhDb29yZHM7CiAgICAgICAgRmxv
YXRCdWZmZXIgbVZlcnRDb29yZHM7CiAgICAgICAgYm9vbGVhbiB1c2luZ1ZCT3M7CiAgICAgICAg
aW50IG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2VzOwogICAgICAgIGludCBtVkJPX0Zvcl9S
ZXN1YWJsZVRpbGVUZXhDb29yZHM7CgogICAgICAgIFBpcGVsaW5lZF9RdWFkUmVuZGVyZXIoKSB7
CiAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwogICAgICAgICAgICBtVmVy
dENvb3JkcyA9IEJ1ZmZlclV0aWwubmV3RmxvYXRCdWZmZXIoa1RvdGFsQnVmZmVyU2l6ZUNvb3Jk
c1ZlcnRzKTsKICAgICAgICAgICAgbVRleENvb3JkcyA9IEJ1ZmZlclV0aWwubmV3RmxvYXRCdWZm
ZXIoa1RvdGFsQnVmZmVyU2l6ZUNvb3Jkc1RleCk7CgogICAgICAgICAgICB1c2luZ1ZCT3MgPSBp
c1ZCT0F2YWlsYWJsZShnbCk7CgogICAgICAgICAgICBpZiAodXNpbmdWQk9zKSB7CiAgICAgICAg
ICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGludFtdIHZib3MgPSBuZXcgaW50WzJd
OwogICAgICAgICAgICAgICAgICAgIGdsLmdsR2VuQnVmZmVycygyLCBJbnRCdWZmZXIud3JhcCh2
Ym9zKSk7CgogICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2Vz
ID0gdmJvc1swXTsKICAgICAgICAgICAgICAgICAgICBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVUZXhD
b29yZHMgPSB2Ym9zWzFdOwoKICAgICAgICAgICAgICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wu
R0xfQVJSQVlfQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVkJP
X0Zvcl9SZXN1YWJsZVRpbGVWZXJ0aWNlcyk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCdWZm
ZXJEYXRhKEdMLkdMX0FSUkFZX0JVRkZFUiwga1RvdGFsQnVmZmVyU2l6ZUJ5dGVzVmVydHMsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEdMLkdMX1NUUkVBTV9EUkFX
KTsgLy8gc3RyZWFtIGRyYXcgYmVjYXVzZSB0aGlzIGlzIGEgc2luZ2xlIHF1YWQgdXNlIHBpcGVs
aW5lCgogICAgICAgICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJBWV9CVUZG
RVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxl
VGlsZVRleENvb3Jkcyk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCdWZmZXJEYXRhKEdMLkdM
X0FSUkFZX0JVRkZFUiwga1RvdGFsQnVmZmVyU2l6ZUJ5dGVzVGV4LAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBudWxsLCBHTC5HTF9TVFJFQU1fRFJBVyk7IC8vIHN0cmVhbSBk
cmF3IGJlY2F1c2UgdGhpcyBpcyBhIHNpbmdsZSBxdWFkIHVzZSBwaXBlbGluZQogICAgICAgICAg
ICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICBpc0V4dGVu
c2lvbkF2YWlsYWJsZV9WQk8gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB1c2luZ1ZCT3Mg
PSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAg
ICAgcHVibGljIHZvaWQgZ2xUZXhDb29yZDJmKGZsb2F0IHYsIGZsb2F0IHYxKSB7CiAgICAgICAg
ICAgIG1UZXhDb29yZHMucHV0KHYpOwogICAgICAgICAgICBtVGV4Q29vcmRzLnB1dCh2MSk7CiAg
ICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBnbFZlcnRleDNmKGZsb2F0IGluWCwgZmxvYXQg
aW5ZLCBmbG9hdCBpblopIHsKICAgICAgICAgICAgbVZlcnRDb29yZHMucHV0KGluWCk7CiAgICAg
ICAgICAgIG1WZXJ0Q29vcmRzLnB1dChpblkpOwogICAgICAgICAgICBtVmVydENvb3Jkcy5wdXQo
aW5aKTsKCiAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUrKzsK
CiAgICAgICAgICAgIGlmIChtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lID49IGtU
b3RhbEJ1ZmZlclNpemVWZXJ0cykgewogICAgICAgICAgICAgICAgdGhpcy5kcmF3KCk7CiAgICAg
ICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCBkcmF3KCkgewogICAgICAg
ICAgICBpZiAodXNlVmVydGV4QXJyYXlzKSB7CiAgICAgICAgICAgICAgICBkcmF3VmVydGV4QXJy
YXlzKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkcmF3SU1NRURJQVRF
KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCBkcmF3VmVy
dGV4QXJyYXlzKCkgewogICAgICAgICAgICBpZiAobU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQ
aXBlbGluZSA+IDApIHsKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgp
OwoKICAgICAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdT
dG9yZSgpOwogICAgICAgICAgICAgICAgVGV4dHVyZSB0ZXh0dXJlID0gcmVuZGVyZXIuZ2V0VGV4
dHVyZSgpOyAvLyB0cmlnZ2VycyB0ZXh0dXJlIHVwbG9hZHMuICBNYXliZSB0aGlzIHNob3VsZCBi
ZSBtb3JlIG9idmlvdXM/CgogICAgICAgICAgICAgICAgbVZlcnRDb29yZHMucmV3aW5kKCk7CiAg
ICAgICAgICAgICAgICBtVGV4Q29vcmRzLnJld2luZCgpOwoKICAgICAgICAgICAgICAgIGdsLmds
RW5hYmxlQ2xpZW50U3RhdGUoR0wuR0xfVkVSVEVYX0FSUkFZKTsKCiAgICAgICAgICAgICAgICBp
ZiAodXNpbmdWQk9zKSB7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdM
X0FSUkFZX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZCT19G
b3JfUmVzdWFibGVUaWxlVmVydGljZXMpOwogICAgICAgICAgICAgICAgICAgIGdsLmdsQnVmZmVy
U3ViRGF0YShHTC5HTF9BUlJBWV9CVUZGRVIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgKiBrU2l6ZUlu
Qnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbVZlcnRDb29yZHMpOyAvLyB1cGxvYWQgb25seSB0aGUgbmV3IHN0dWZmCiAg
ICAgICAgICAgICAgICAgICAgZ2wuZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMLkdMX0ZMT0FULCAwLCAw
KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xWZXJ0
ZXhQb2ludGVyKDMsIEdMLkdMX0ZMT0FULCAwLCBtVmVydENvb3Jkcyk7CiAgICAgICAgICAgICAg
ICB9CgogICAgICAgICAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTC5HTF9URVhUVVJF
X0NPT1JEX0FSUkFZKTsKCiAgICAgICAgICAgICAgICBpZiAodXNpbmdWQk9zKSB7CiAgICAgICAg
ICAgICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZCT19Gb3JfUmVzdWFibGVUaWxlVGV4Q29vcmRz
KTsKICAgICAgICAgICAgICAgICAgICBnbC5nbEJ1ZmZlclN1YkRhdGEoR0wuR0xfQVJSQVlfQlVG
RkVSLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0c3RhbmRp
bmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lICoga1NpemVJbkJ5dGVzX09uZVZlcnRpY2VzX1RleERh
dGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXhDb29yZHMpOyAv
LyB1cGxvYWQgb25seSB0aGUgbmV3IHN0dWZmCiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhD
b29yZFBvaW50ZXIoMiwgR0wuR0xfRkxPQVQsIDAsIDApOwogICAgICAgICAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgICAgICAgICBnbC5nbFRleENvb3JkUG9pbnRlcigyLCBHTC5HTF9GTE9B
VCwgMCwgbVRleENvb3Jkcyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZ2wu
Z2xEcmF3QXJyYXlzKEdMLkdMX1FVQURTLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUpOwoKICAgICAgICAgICAgICAg
IG1WZXJ0Q29vcmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAgbVRleENvb3Jkcy5yZXdpbmQo
KTsKICAgICAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgPSAw
OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0lNTUVE
SUFURSgpIHsKICAgICAgICAgICAgaWYgKG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxp
bmUgPiAwKSB7CiAgICAgICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXIgPSBnZXRC
YWNraW5nU3RvcmUoKTsKICAgICAgICAgICAgICAgIFRleHR1cmUgdGV4dHVyZSA9IHJlbmRlcmVy
LmdldFRleHR1cmUoKTsgLy8gdHJpZ2dlcnMgdGV4dHVyZSB1cGxvYWRzLiAgTWF5YmUgdGhpcyBz
aG91bGQgYmUgbW9yZSBvYnZpb3VzPwoKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1
cnJlbnRHTCgpOwogICAgICAgICAgICAgICAgZ2wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7CgogICAg
ICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyT2ZRdWFkcyA9
IG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgLyA0OwogICAgICAgICAgICAgICAg
ICAgIG1WZXJ0Q29vcmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgIG1UZXhDb29yZHMu
cmV3aW5kKCk7CgogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVy
T2ZRdWFkczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4Q29vcmQyZiht
VGV4Q29vcmRzLmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAg
ICAgZ2wuZ2xWZXJ0ZXgzZihtVmVydENvb3Jkcy5nZXQoKSwgbVZlcnRDb29yZHMuZ2V0KCksCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlcnRDb29yZHMuZ2V0KCkpOwoK
ICAgICAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZDJmKG1UZXhDb29yZHMuZ2V0KCks
IG1UZXhDb29yZHMuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBnbC5nbFZlcnRleDNm
KG1WZXJ0Q29vcmRzLmdldCgpLCBtVmVydENvb3Jkcy5nZXQoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQoKSk7CgogICAgICAgICAgICAgICAg
ICAgICAgICBnbC5nbFRleENvb3JkMmYobVRleENvb3Jkcy5nZXQoKSwgbVRleENvb3Jkcy5nZXQo
KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4M2YobVZlcnRDb29yZHMuZ2V0
KCksIG1WZXJ0Q29vcmRzLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1WZXJ0Q29vcmRzLmdldCgpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4
Q29vcmQyZihtVGV4Q29vcmRzLmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsKICAgICAgICAgICAg
ICAgICAgICAgICAgZ2wuZ2xWZXJ0ZXgzZihtVmVydENvb3Jkcy5nZXQoKSwgbVZlcnRDb29yZHMu
Z2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlcnRDb29yZHMu
Z2V0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4
Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAg
ICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xFbmQoKTsK
ICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5yZXdpbmQoKTsKICAgICAgICAgICAgICAg
ICAgICBtVGV4Q29vcmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgIG1PdXRzdGFuZGlu
Z0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICB9CiAgICAgICAgfQogICAgfQoKICAgIGNsYXNzIERlYnVnTGlzdGVuZXIgaW1wbGVtZW50cyBH
TEV2ZW50TGlzdGVuZXIgewogICAgICAgIHByaXZhdGUgR0xVIGdsdSA9IG5ldyBHTFUoKTsKICAg
ICAgICBwcml2YXRlIEZyYW1lIGZyYW1lOwoKICAgICAgICBEZWJ1Z0xpc3RlbmVyKEZyYW1lIGZy
YW1lKSB7CiAgICAgICAgICAgIHRoaXMuZnJhbWUgPSBmcmFtZTsKICAgICAgICB9CgogICAgICAg
IHB1YmxpYyB2b2lkIGRpc3BsYXkoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUpIHsKICAgICAgICAg
ICAgR0wgZ2wgPSBkcmF3YWJsZS5nZXRHTCgpOwogICAgICAgICAgICBnbC5nbENsZWFyKEdMLkdM
X0RFUFRIX0JVRkZFUl9CSVQgfCBHTC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKCiAgICAgICAgICAg
IGlmIChwYWNrZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAg
ICB9CgogICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZCA9IGdldEJhY2tpbmdTdG9yZSgp
OwogICAgICAgICAgICBmaW5hbCBpbnQgdyA9IHJlbmQuZ2V0V2lkdGgoKTsKICAgICAgICAgICAg
ZmluYWwgaW50IGggPSByZW5kLmdldEhlaWdodCgpOwogICAgICAgICAgICByZW5kLmJlZ2luT3J0
aG9SZW5kZXJpbmcodywgaCk7CiAgICAgICAgICAgIHJlbmQuZHJhd09ydGhvUmVjdCgwLCAwKTsK
ICAgICAgICAgICAgcmVuZC5lbmRPcnRob1JlbmRlcmluZygpOwoKICAgICAgICAgICAgaWYgKChm
cmFtZS5nZXRXaWR0aCgpICE9IHcpIHx8IChmcmFtZS5nZXRIZWlnaHQoKSAhPSBoKSkgewogICAg
ICAgICAgICAgICAgRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7CiAgICAg
ICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZyYW1lLnNldFNpemUodywgaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAg
Ly8gVW51c2VkIG1ldGhvZHMKICAgICAgICBwdWJsaWMgdm9pZCBpbml0KEdMQXV0b0RyYXdhYmxl
IGRyYXdhYmxlKSB7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCByZXNoYXBlKEdMQXV0
b0RyYXdhYmxlIGRyYXdhYmxlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2
b2lkIGRpc3BsYXlDaGFuZ2VkKEdMQXV0b0RyYXdhYmxlIGRyYXdhYmxlLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbW9kZUNoYW5nZWQsIGJvb2xlYW4gZGV2aWNl
Q2hhbmdlZCkgewogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldHMgd2hldGhlciB2
ZXJ0ZXggYXJyYXlzIGFyZSBiZWluZyB1c2VkIGludGVybmFsbHkgZm9yCiAgICAgKiByZW5kZXJp
bmcsIG9yIHdoZXRoZXIgdGV4dCBpcyByZW5kZXJlZCB1c2luZyB0aGUgT3BlbkdMCiAgICAgKiBp
bW1lZGlhdGUgbW9kZSBjb21tYW5kcy4gVGhpcyBpcyBwcm92aWRlZCBhcyBhIGNvbmNlc3Npb24g
Zm9yCiAgICAgKiBjZXJ0YWluIGdyYXBoaWNzIGNhcmRzIHdoaWNoIGhhdmUgcG9vciB2ZXJ0ZXgg
YXJyYXkKICAgICAqIHBlcmZvcm1hbmNlLiBEZWZhdWx0cyB0byB0cnVlLgogICAgICovCiAgICBw
dWJsaWMgdm9pZCBzZXRVc2VWZXJ0ZXhBcnJheXMoYm9vbGVhbiB1c2VWZXJ0ZXhBcnJheXMpIHsK
ICAgICAgICB0aGlzLnVzZVZlcnRleEFycmF5cyA9IHVzZVZlcnRleEFycmF5czsKICAgIH0KCiAg
ICAvKioKICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHZlcnRleCBhcnJheXMgYXJlIGJlaW5nIHVz
ZWQgaW50ZXJuYWxseSBmb3IKICAgICAqIHJlbmRlcmluZywgb3Igd2hldGhlciB0ZXh0IGlzIHJl
bmRlcmVkIHVzaW5nIHRoZSBPcGVuR0wKICAgICAqIGltbWVkaWF0ZSBtb2RlIGNvbW1hbmRzLiBE
ZWZhdWx0cyB0byB0cnVlLgogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VWZXJ0ZXhB
cnJheXMoKSB7CiAgICAgICAgcmV0dXJuIHVzZVZlcnRleEFycmF5czsKICAgIH0KCiAgICAvKioK
ICAgICAqIFNldHMgd2hldGhlciBzbW9vdGhpbmcgKGkuZS4sIEdMX0xJTkVBUiBmaWx0ZXJpbmcp
IGlzIGVuYWJsZWQKICAgICAqIGluIHRoZSBiYWNraW5nIFRleHR1cmVSZW5kZXJlciBvZiB0aGlz
IFRleHRSZW5kZXJlci4gQSBmZXcKICAgICAqIGdyYXBoaWNzIGNhcmRzIGRvIG5vdCBiZWhhdmUg
d2VsbCB3aGVuIHRoaXMgaXMgZW5hYmxlZCwKICAgICAqIHJlc3VsdGluZyBpbiBmdXp6eSB0ZXh0
LiBEZWZhdWx0cyB0byB0cnVlLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRTbW9vdGhpbmco
Ym9vbGVhbiBzbW9vdGhpbmcpIHsKICAgICAgICB0aGlzLnNtb290aGluZyA9IHNtb290aGluZzsK
ICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRTbW9vdGhpbmcoc21vb3RoaW5nKTsKICAgIH0K
CiAgICAvKioKICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHNtb290aGluZyBpcyBlbmFibGVkIGlu
IHRoZSBiYWNraW5nCiAgICAgKiBUZXh0dXJlUmVuZGVyZXIgb2YgdGhpcyBUZXh0UmVuZGVyZXIu
IEEgZmV3IGdyYXBoaWNzIGNhcmRzIGRvCiAgICAgKiBub3QgYmVoYXZlIHdlbGwgd2hlbiB0aGlz
IGlzIGVuYWJsZWQsIHJlc3VsdGluZyBpbiBmdXp6eSB0ZXh0LgogICAgICogRGVmYXVsdHMgdG8g
dHJ1ZS4KICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gZ2V0U21vb3RoaW5nKCkgewogICAgICAg
IHJldHVybiBzbW9vdGhpbmc7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGlzVkJPQXZhaWxh
YmxlKEdMIGdsKSB7CiAgICAgICAgaWYgKCFjaGVja0Zvcl9pc0V4dGVuc2lvbkF2YWlsYWJsZV9W
Qk8pIHsKICAgICAgICAgICAgaXNFeHRlbnNpb25BdmFpbGFibGVfVkJPID0gZ2wuaXNFeHRlbnNp
b25BdmFpbGFibGUoIkdMX1ZFUlNJT05fMV81Iik7CgkgICAgLyoqCgkgICAgICogR0xfQVJCX3Zl
cnRleF9idWZmZXJfb2JqZWN0IGlzIGF2YWlsYWJsZSBpbiBPcGVuR0wgMS40LiBNaXhpbmcgCgkg
ICAgICogdmVydGV4IGFycmF5cyBhbmQgVkJPIGNhbiBjYXVzZSBzb21lIHByb2JsZW1zIHdoZW4g
Y2FsbGluZyAKCSAgICAgKiBnbFZlcnRleFBvaW50ZXIgZnJvbSB0aGUgVGV4dFJlbmRlcmVyIHdo
ZXJlYXMgZ2xCaW5kQnVmZmVyQVJCCgkgICAgICogd2FzIGNhbGxlZCBiZWZvcmUgaW4gb3JkZXIg
dG8gYmluZCBhIFZCTyBiZWNhdXNlIG5vIFZCTyAKCSAgICAgKiBtdXN0IGJlIGFscmVhZHkgYm91
bmQgd2hlbiBjYWxsaW5nIGdsVmVydGV4UG9pbnRlciB3aXRoIGEgTklPIAoJICAgICAqIGJ1ZmZl
ciBhcyBsYXN0IGFyZ3VtZW50LgoJICAgICAqIFdlIGNhbm5vdCBhc2sgdGhlIHByb2dyYW1tZXJz
IHRvIGV4cGxpY2l0bHkgdW5iaW5kIHRoZWlyIFZCT3MKCSAgICAgKiB0byBhdm9pZCB0aGlzIHBy
b2JsZW0gYmVjYXVzZSBpdCBoYXMgYW4gaW1wb3J0YW50IGNvc3QgCgkgICAgICogZXNwZWNpYWxs
eSBmb3Igc3RhdGljIFZCT3MuCgkgICAgICovCgkgICAgaWYgKCFpc0V4dGVuc2lvbkF2YWlsYWJs
ZV9WQk8pIHsKCSAgICAgICAgaWYgKGdsLmlzRXh0ZW5zaW9uQXZhaWxhYmxlKCJHTF9WRVJTSU9O
XzFfNCIpKSB7CgkJICAgIGlmIChnbC5pc0V4dGVuc2lvbkF2YWlsYWJsZSgiR0xfQVJCX3ZlcnRl
eF9idWZmZXJfb2JqZWN0IikgCgkJICAgICAgICAmJiBnbC5pc0Z1bmN0aW9uQXZhaWxhYmxlKCJn
bEJpbmRCdWZmZXJBUkIiKQoJCQkmJiBnbC5pc0Z1bmN0aW9uQXZhaWxhYmxlKCJnbEJ1ZmZlckRh
dGFBUkIiKQoJCQkmJiBnbC5pc0Z1bmN0aW9uQXZhaWxhYmxlKCJnbEdlbkJ1ZmZlcnNBUkIiKSkg
ewoJCQlpc0V4dGVuc2lvbkF2YWlsYWJsZV9WQk8gPSB0cnVlOwoJICAgICAgICAgICAgfQoJCX0K
CSAgICB9CiAgICAgICAgICAgIGNoZWNrRm9yX2lzRXh0ZW5zaW9uQXZhaWxhYmxlX1ZCTyA9IHRy
dWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpc0V4dGVuc2lvbkF2YWlsYWJsZV9WQk87CiAg
ICB9Cn0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>129</attachid>
            <date>2008-06-02 23:58:00 +0200</date>
            <delta_ts>2008-06-02 23:58:00 +0200</delta_ts>
            <desc>Cleanest bug fix version 2 (GL_ARB_vertex_buffer_object can be supported in OpenGL 1.3 on some graphics cards)</desc>
            <filename>TextRenderer.java</filename>
            <type>text/plain</type>
            <size>79216</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChjKSAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKICogbWV0OgogKgog
KiAtIFJlZGlzdHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIC0gUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgogKgogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIElu
Yy4gb3IgdGhlIG5hbWVzIG9mCiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRoaXMgc29mdHdhcmUg
aXMgcHJvdmlkZWQgIkFTIElTLCIgd2l0aG91dCBhIHdhcnJhbnR5IG9mIGFueSBraW5kLiBBTEwK
ICogRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FS
UkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJ
TElUWSwgRklUTkVTUyBGT1IgQQogKiBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdF
TUVOVCwgQVJFIEhFUkVCWSBFWENMVURFRC4gU1VOCiAqIE1JQ1JPU1lTVEVNUywgSU5DLiAoIlNV
TiIpIEFORCBJVFMgTElDRU5TT1JTIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SCiAqIEFOWSBEQU1B
R0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIFVTSU5HLCBNT0RJRllJTkcg
T1IKICogRElTVFJJQlVUSU5HIFRISVMgU09GVFdBUkUgT1IgSVRTIERFUklWQVRJVkVTLiBJTiBO
TyBFVkVOVCBXSUxMIFNVTiBPUgogKiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIExP
U1QgUkVWRU5VRSwgUFJPRklUIE9SIERBVEEsIE9SIEZPUgogKiBESVJFQ1QsIElORElSRUNULCBT
UEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SIFBVTklUSVZFCiAqIERBTUFHRVMs
IEhPV0VWRVIgQ0FVU0VEIEFORCBSRUdBUkRMRVNTIE9GIFRIRSBUSEVPUlkgT0YgTElBQklMSVRZ
LAogKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRgogKiBTVU4gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0VTLgogKgogKiBZb3UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIHNvZnR3
YXJlIGlzIG5vdCBkZXNpZ25lZCBvciBpbnRlbmRlZCBmb3IgdXNlCiAqIGluIHRoZSBkZXNpZ24s
IGNvbnN0cnVjdGlvbiwgb3BlcmF0aW9uIG9yIG1haW50ZW5hbmNlIG9mIGFueSBudWNsZWFyCiAq
IGZhY2lsaXR5LgogKgogKiBTdW4gZ3JhdGVmdWxseSBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIHNv
ZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGF1dGhvcmVkCiAqIGFuZCBkZXZlbG9wZWQgYnkgS2VubmV0
aCBCcmFkbGV5IFJ1c3NlbGwgYW5kIENocmlzdG9waGVyIEpvaG4gS2xpbmUuCiAqLwpwYWNrYWdl
IGNvbS5zdW4ub3BlbmdsLnV0aWwuajJkOwoKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwuKjsK
aW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwucGFja3JlY3QuKjsKaW1wb3J0IGNvbS5zdW4ub3Bl
bmdsLnV0aWwuKjsKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLnV0aWwudGV4dHVyZS4qOwoKaW1wb3J0
IGphdmEuYXd0LkFscGhhQ29tcG9zaXRlOwppbXBvcnQgamF2YS5hd3QuQ29sb3I7CmltcG9ydCBq
YXZhLmF3dC5Db21wb3NpdGU7CgovLyBGb3IgZGVidWdnaW5nIHB1cnBvc2VzCmltcG9ydCBqYXZh
LmF3dC5FdmVudFF1ZXVlOwppbXBvcnQgamF2YS5hd3QuRm9udDsKaW1wb3J0IGphdmEuYXd0LkZy
YW1lOwppbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKaW1wb3J0IGphdmEuYXd0LkltYWdlOwpp
bXBvcnQgamF2YS5hd3QuUG9pbnQ7CmltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKaW1w
b3J0IGphdmEuYXd0LmV2ZW50Lio7CmltcG9ydCBqYXZhLmF3dC5mb250Lio7CmltcG9ydCBqYXZh
LmF3dC5nZW9tLio7CgppbXBvcnQgamF2YS5uaW8uKjsKCmltcG9ydCBqYXZhLnRleHQuKjsKCmlt
cG9ydCBqYXZhLnV0aWwuKjsKCmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuKjsKaW1wb3J0IGph
dmF4Lm1lZGlhLm9wZW5nbC5nbHUuKjsKCgovKiogUmVuZGVycyBiaXRtYXBwZWQgSmF2YSAyRCB0
ZXh0IGludG8gYW4gT3BlbkdMIHdpbmRvdyB3aXRoIGhpZ2gKICAgIHBlcmZvcm1hbmNlLCBmdWxs
IFVuaWNvZGUgc3VwcG9ydCwgYW5kIGEgc2ltcGxlIEFQSS4gUGVyZm9ybXMKICAgIGFwcHJvcHJp
YXRlIGNhY2hpbmcgb2YgdGV4dCByZW5kZXJpbmcgcmVzdWx0cyBpbiBhbiBPcGVuR0wgdGV4dHVy
ZQogICAgaW50ZXJuYWxseSB0byBhdm9pZCByZXBlYXRlZCBmb250IHJhc3Rlcml6YXRpb24uIFRo
ZSBjYWNoaW5nIGlzCiAgICBjb21wbGV0ZWx5IGF1dG9tYXRpYywgZG9lcyBub3QgcmVxdWlyZSBh
bnkgdXNlciBpbnRlcnZlbnRpb24sIGFuZAogICAgaGFzIG5vIHZpc2libGUgY29udHJvbHMgaW4g
dGhlIHB1YmxpYyBBUEkuIDxQPgoKICAgIFVzaW5nIHRoZSB7QGxpbmsgVGV4dFJlbmRlcmVyIFRl
eHRSZW5kZXJlcn0gaXMgc2ltcGxlLiBBZGQgYQogICAgIjxjb2RlPlRleHRSZW5kZXJlciByZW5k
ZXJlcjs8L2NvZGU+IiBmaWVsZCB0byB5b3VyIHtAbGluawogICAgamF2YXgubWVkaWEub3Blbmds
LkdMRXZlbnRMaXN0ZW5lciBHTEV2ZW50TGlzdGVuZXJ9LiBJbiB5b3VyIHtAbGluawogICAgamF2
YXgubWVkaWEub3BlbmdsLkdMRXZlbnRMaXN0ZW5lciNpbml0IGluaXR9IG1ldGhvZCwgYWRkOgoK
ICAgIDxQUkU+CiAgICByZW5kZXJlciA9IG5ldyBUZXh0UmVuZGVyZXIobmV3IEZvbnQoIlNhbnNT
ZXJpZiIsIEZvbnQuQk9MRCwgMzYpKTsKICAgIDwvUFJFPgoKICAgIDxQPiBJbiB0aGUge0BsaW5r
IGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIjZGlzcGxheSBkaXNwbGF5fSBtZXRo
b2Qgb2YgeW91cgogICAge0BsaW5rIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIg
R0xFdmVudExpc3RlbmVyfSwgYWRkOgogICAgPFBSRT4KICAgIHJlbmRlcmVyLmJlZ2luUmVuZGVy
aW5nKGRyYXdhYmxlLmdldFdpZHRoKCksIGRyYXdhYmxlLmdldEhlaWdodCgpKTsKICAgIC8vIG9w
dGlvbmFsbHkgc2V0IHRoZSBjb2xvcgogICAgcmVuZGVyZXIuc2V0Q29sb3IoMS4wZiwgMC4yZiwg
MC4yZiwgMC44Zik7CiAgICByZW5kZXJlci5kcmF3KCJUZXh0IHRvIGRyYXciLCB4UG9zaXRpb24s
IHlQb3NpdGlvbik7CiAgICAvLyAuLi4gbW9yZSBkcmF3IGNvbW1hbmRzLCBjb2xvciBjaGFuZ2Vz
LCBldGMuCiAgICByZW5kZXJlci5lbmRSZW5kZXJpbmcoKTsKICAgIDwvUFJFPgoKICAgIFVubGVz
cyB5b3UgYXJlIHNoYXJpbmcgdGV4dHVyZXMgYW5kIGRpc3BsYXkgbGlzdHMgYmV0d2VlbiBPcGVu
R0wKICAgIGNvbnRleHRzLCB5b3UgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGUge0BsaW5rICNkaXNw
b3NlIGRpc3Bvc2V9CiAgICBtZXRob2Qgb2YgdGhlIFRleHRSZW5kZXJlcjsgdGhlIE9wZW5HTCBy
ZXNvdXJjZXMgaXQgdXNlcwogICAgaW50ZXJuYWxseSB3aWxsIGJlIGNsZWFuZWQgdXAgYXV0b21h
dGljYWxseSB3aGVuIHRoZSBPcGVuR0wKICAgIGNvbnRleHQgaXMgZGVzdHJveWVkLiA8UD4KCiAg
ICA8Yj5Ob3RlPC9iPiB0aGF0IHRoZSBUZXh0UmVuZGVyZXIgbWF5IGNhdXNlIHRoZSB2ZXJ0ZXgg
YW5kIHRleHR1cmUKICAgIGNvb3JkaW5hdGUgYXJyYXkgYnVmZmVyIGJpbmRpbmdzIHRvIGNoYW5n
ZSwgb3IgdG8gYmUgdW5ib3VuZC4gVGhpcwogICAgaXMgaW1wb3J0YW50IHRvIG5vdGUgaWYgeW91
IGFyZSB1c2luZyBWZXJ0ZXggQnVmZmVyIE9iamVjdHMgKFZCT3MpCiAgICBpbiB5b3VyIGFwcGxp
Y2F0aW9uLiA8UD4KCiAgICBJbnRlcm5hbGx5LCB0aGUgcmVuZGVyZXIgdXNlcyBhIHJlY3Rhbmds
ZSBwYWNraW5nIGFsZ29yaXRobSB0bwogICAgcGFjayBib3RoIGdseXBocyBhbmQgZnVsbCBTdHJp
bmdzJyByZW5kZXJpbmcgcmVzdWx0cyAod2hpY2ggYXJlCiAgICB2YXJpYWJsZSBzaXplKSBvbnRv
IGEgbGFyZ2VyIE9wZW5HTCB0ZXh0dXJlLiBUaGUgaW50ZXJuYWwgYmFja2luZwogICAgc3RvcmUg
aXMgbWFpbnRhaW5lZCB1c2luZyBhIHtAbGluawogICAgY29tLnN1bi5vcGVuZ2wudXRpbC5qMmQu
VGV4dHVyZVJlbmRlcmVyIFRleHR1cmVSZW5kZXJlcn0uIEEgbGVhc3QKICAgIHJlY2VudGx5IHVz
ZWQgKExSVSkgYWxnb3JpdGhtIGlzIHVzZWQgdG8gZGlzY2FyZCBwcmV2aW91c2x5CiAgICByZW5k
ZXJlZCBzdHJpbmdzOyB0aGUgc3BlY2lmaWMgYWxnb3JpdGhtIGlzIHVuZGVmaW5lZCwgYnV0IGlz
CiAgICBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYnkgZmx1c2hpbmcgdW51c2VkIFN0cmluZ3MnIHJl
bmRlcmluZwogICAgcmVzdWx0cyBldmVyeSBmZXcgaHVuZHJlZCByZW5kZXJpbmcgY3ljbGVzLCB3
aGVyZSBhIHJlbmRlcmluZwogICAgY3ljbGUgaXMgZGVmaW5lZCBhcyBhIHBhaXIgb2YgY2FsbHMg
dG8ge0BsaW5rICNiZWdpblJlbmRlcmluZwogICAgYmVnaW5SZW5kZXJpbmd9IC8ge0BsaW5rICNl
bmRSZW5kZXJpbmcgZW5kUmVuZGVyaW5nfS4KCiAgICBAYXV0aG9yIEpvaG4gQnVya2V5CiAgICBA
YXV0aG9yIEtlbm5ldGggUnVzc2VsbAoqLwpwdWJsaWMgY2xhc3MgVGV4dFJlbmRlcmVyIHsKICAg
IHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEZWJ1Zy5kZWJ1ZygiVGV4dFJl
bmRlcmVyIik7CgogICAgLy8gVGhlc2UgYXJlIG9jY2FzaW9uYWxseSB1c2VmdWwgZm9yIG1vcmUg
aW4tZGVwdGggZGVidWdnaW5nCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU0FC
TEVfR0xZUEhfQ0FDSEUgPSBmYWxzZTsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4g
RFJBV19CQk9YRVMgPSBmYWxzZTsKCiAgICBzdGF0aWMgZmluYWwgaW50IGtTaXplID0gMjU2OwoK
ICAgIC8vIEV2ZXJ5IGNlcnRhaW4gbnVtYmVyIG9mIHJlbmRlciBjeWNsZXMsIGZsdXNoIHRoZSBz
dHJpbmdzIHdoaWNoCiAgICAvLyBoYXZlbid0IGJlZW4gdXNlZCByZWNlbnRseQogICAgcHJpdmF0
ZSBzdGF0aWMgZmluYWwgaW50IENZQ0xFU19QRVJfRkxVU0ggPSAxMDA7CgogICAgLy8gVGhlIGFt
b3VudCBvZiB2ZXJ0aWNhbCBkZWFkIHNwYWNlIG9uIHRoZSBiYWNraW5nIHN0b3JlIGJlZm9yZSB3
ZQogICAgLy8gZm9yY2UgYSBjb21wYWN0aW9uCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9h
dCBNQVhfVkVSVElDQUxfRlJBR01FTlRBVElPTiA9IDAuN2Y7CiAgICBzdGF0aWMgZmluYWwgaW50
IGtRdWFkc1BlckJ1ZmZlciA9IDEwMDsKICAgIHN0YXRpYyBmaW5hbCBpbnQga0Nvb3Jkc1BlclZl
cnRWZXJ0cyA9IDM7CiAgICBzdGF0aWMgZmluYWwgaW50IGtDb29yZHNQZXJWZXJ0VGV4ID0gMjsK
ICAgIHN0YXRpYyBmaW5hbCBpbnQga1ZlcnRzUGVyUXVhZCA9IDQ7CiAgICBzdGF0aWMgZmluYWwg
aW50IGtUb3RhbEJ1ZmZlclNpemVWZXJ0cyA9IGtRdWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1
YWQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNWZXJ0cyA9IGtR
dWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1YWQgKiBrQ29vcmRzUGVyVmVydFZlcnRzOwogICAg
c3RhdGljIGZpbmFsIGludCBrVG90YWxCdWZmZXJTaXplQ29vcmRzVGV4ID0ga1F1YWRzUGVyQnVm
ZmVyICoga1ZlcnRzUGVyUXVhZCAqIGtDb29yZHNQZXJWZXJ0VGV4OwogICAgc3RhdGljIGZpbmFs
IGludCBrVG90YWxCdWZmZXJTaXplQnl0ZXNWZXJ0cyA9IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNW
ZXJ0cyAqIDQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVCeXRlc1RleCA9
IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNUZXggKiA0OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6
ZUluQnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSA9IGtDb29yZHNQZXJWZXJ0VmVydHMgKiA0
OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6ZUluQnl0ZXNfT25lVmVydGljZXNfVGV4RGF0YSA9
IGtDb29yZHNQZXJWZXJ0VGV4ICogNDsKICAgIHByaXZhdGUgRm9udCBmb250OwogICAgcHJpdmF0
ZSBib29sZWFuIGFudGlhbGlhc2VkOwogICAgcHJpdmF0ZSBib29sZWFuIHVzZUZyYWN0aW9uYWxN
ZXRyaWNzOwoKICAgIC8vIFdoZXRoZXIgd2UncmUgYXR0ZW1wdGluZyB0byB1c2UgYXV0b21hdGlj
IG1pcG1hcCBnZW5lcmF0aW9uIHN1cHBvcnQKICAgIHByaXZhdGUgYm9vbGVhbiBtaXBtYXA7CiAg
ICBwcml2YXRlIFJlY3RhbmdsZVBhY2tlciBwYWNrZXI7CiAgICBwcml2YXRlIGJvb2xlYW4gaGF2
ZU1heFNpemU7CiAgICBwcml2YXRlIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlOwogICAg
cHJpdmF0ZSBUZXh0dXJlUmVuZGVyZXIgY2FjaGVkQmFja2luZ1N0b3JlOwogICAgcHJpdmF0ZSBH
cmFwaGljczJEIGNhY2hlZEdyYXBoaWNzOwogICAgcHJpdmF0ZSBGb250UmVuZGVyQ29udGV4dCBj
YWNoZWRGb250UmVuZGVyQ29udGV4dDsKICAgIHByaXZhdGUgTWFwIC8qPFN0cmluZyxSZWN0Piov
IHN0cmluZ0xvY2F0aW9ucyA9IG5ldyBIYXNoTWFwIC8qPFN0cmluZyxSZWN0PiovKCk7CiAgICBw
cml2YXRlIEdseXBoUHJvZHVjZXIgbUdseXBoUHJvZHVjZXI7CgogICAgcHJpdmF0ZSBpbnQgbnVt
UmVuZGVyQ3ljbGVzOwoKICAgIC8vIE5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3Jl
IGluIGEgYmVnaW5SZW5kZXJpbmcoKSAvCiAgICAvLyBlbmRSZW5kZXJpbmcoKSBjeWNsZSBzbyB3
ZSBjYW4gcmUtZW50ZXIgdGhlIGV4YWN0IHNhbWUgc3RhdGUgaWYKICAgIC8vIHdlIGhhdmUgdG8g
cmVhbGxvY2F0ZSB0aGUgYmFja2luZyBzdG9yZQogICAgcHJpdmF0ZSBib29sZWFuIGluQmVnaW5F
bmRQYWlyOwogICAgcHJpdmF0ZSBib29sZWFuIGlzT3J0aG9Nb2RlOwogICAgcHJpdmF0ZSBpbnQg
YmVnaW5SZW5kZXJpbmdXaWR0aDsKICAgIHByaXZhdGUgaW50IGJlZ2luUmVuZGVyaW5nSGVpZ2h0
OwogICAgcHJpdmF0ZSBib29sZWFuIGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQ7Cgog
ICAgLy8gRm9yIHJlc2V0dGluZyB0aGUgY29sb3IgYWZ0ZXIgZGlzcG9zYWwgb2YgdGhlIG9sZCBi
YWNraW5nIHN0b3JlCiAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUNhY2hlZENvbG9yOwogICAgcHJp
dmF0ZSBmbG9hdCBjYWNoZWRSOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRHOwogICAgcHJpdmF0
ZSBmbG9hdCBjYWNoZWRCOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRBOwogICAgcHJpdmF0ZSBD
b2xvciBjYWNoZWRDb2xvcjsKICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9SZXNldENvbG9yOwoK
ICAgIC8vIEZvciBkZWJ1Z2dpbmcgb25seQogICAgcHJpdmF0ZSBGcmFtZSBkYmdGcmFtZTsKCiAg
ICAvLyBEZWJ1Z2dpbmcgcHVycG9zZXMgb25seQogICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnZ2Vk
OwogICAgUGlwZWxpbmVkX1F1YWRSZW5kZXJlciBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyOwogICAg
CiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcKICAgIHByaXZhdGUgYm9vbGVhbiB1c2VW
ZXJ0ZXhBcnJheXMgPSB0cnVlOwogICAgCiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcK
ICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dGVuc2lvbkF2YWlsYWJsZV9WQk87CiAgICBwcml2YXRl
IGJvb2xlYW4gY2hlY2tGb3JfaXNFeHRlbnNpb25BdmFpbGFibGVfVkJPOwoKICAgIC8vIFdoZXRo
ZXIgR0xfTElORUFSIGZpbHRlcmluZyBpcyBlbmFibGVkIGZvciB0aGUgYmFja2luZyBzdG9yZQog
ICAgcHJpdmF0ZSBib29sZWFuIHNtb290aGluZyA9IHRydWU7CgogICAgLyoqIENyZWF0ZXMgYSBu
ZXcgVGV4dFJlbmRlcmVyIHdpdGggdGhlIGdpdmVuIGZvbnQsIHVzaW5nIG5vCiAgICAgICAgYW50
aWFsaWFzaW5nIG9yIGZyYWN0aW9uYWwgbWV0cmljcywgYW5kIHRoZSBkZWZhdWx0CiAgICAgICAg
UmVuZGVyRGVsZWdhdGUuIEVxdWl2YWxlbnQgdG8gPGNvZGU+VGV4dFJlbmRlcmVyKGZvbnQsIGZh
bHNlLAogICAgICAgIGZhbHNlKTwvY29kZT4uCgogICAgICAgIEBwYXJhbSBmb250IHRoZSBmb250
IHRvIHJlbmRlciB3aXRoCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQp
IHsKICAgICAgICB0aGlzKGZvbnQsIGZhbHNlLCBmYWxzZSwgbnVsbCwgZmFsc2UpOwogICAgfQoK
ICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRSZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBmb250LCB1
c2luZyBubwogICAgICAgIGFudGlhbGlhc2luZyBvciBmcmFjdGlvbmFsIG1ldHJpY3MsIGFuZCB0
aGUgZGVmYXVsdAogICAgICAgIFJlbmRlckRlbGVnYXRlLiBJZiA8Q09ERT5taXBtYXA8L0NPREU+
IGlzIHRydWUsIGF0dGVtcHRzIHRvIHVzZQogICAgICAgIE9wZW5HTCdzIGF1dG9tYXRpYyBtaXBt
YXAgZ2VuZXJhdGlvbiBmb3IgYmV0dGVyIHNtb290aGluZyB3aGVuCiAgICAgICAgcmVuZGVyaW5n
IHRoZSBUZXh0dXJlUmVuZGVyZXIncyBjb250ZW50cyBhdCBhIGRpc3RhbmNlLgogICAgICAgIEVx
dWl2YWxlbnQgdG8gPGNvZGU+VGV4dFJlbmRlcmVyKGZvbnQsIGZhbHNlLCBmYWxzZSk8L2NvZGU+
LgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0aAogICAgICAgIEBw
YXJhbSBtaXBtYXAgd2hldGhlciB0byBhdHRlbXB0IHVzZSBvZiBhdXRvbWF0aWMgbWlwbWFwIGdl
bmVyYXRpb24KICAgICovCiAgICBwdWJsaWMgVGV4dFJlbmRlcmVyKEZvbnQgZm9udCwgYm9vbGVh
biBtaXBtYXApIHsKICAgICAgICB0aGlzKGZvbnQsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbWlwbWFw
KTsKICAgIH0KCiAgICAvKiogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgd2l0aCB0aGUgZ2l2
ZW4gRm9udCwgc3BlY2lmaWVkIGZvbnQKICAgICAgICBwcm9wZXJ0aWVzLCBhbmQgZGVmYXVsdCBS
ZW5kZXJEZWxlZ2F0ZS4gVGhlCiAgICAgICAgPGNvZGU+YW50aWFsaWFzZWQ8L2NvZGU+IGFuZCA8
Y29kZT51c2VGcmFjdGlvbmFsTWV0cmljczwvY29kZT4KICAgICAgICBmbGFncyBwcm92aWRlIGNv
bnRyb2wgb3ZlciB0aGUgc2FtZSBwcm9wZXJ0aWVzIGF0IHRoZSBKYXZhIDJECiAgICAgICAgbGV2
ZWwuIE5vIG1pcG1hcCBzdXBwb3J0IGlzIHJlcXVlc3RlZC4gRXF1aXZhbGVudCB0bwogICAgICAg
IDxjb2RlPlRleHRSZW5kZXJlcihmb250LCBhbnRpYWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJp
Y3MsCiAgICAgICAgbnVsbCk8L2NvZGU+LgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0
byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJhbSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBh
bnRpYWxpYXNlZCBmb250cwogICAgICAgIEBwYXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0
aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQKICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJE
IGxldmVsCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQsIGJvb2xlYW4g
YW50aWFsaWFzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRnJhY3Rpb25h
bE1ldHJpY3MpIHsKICAgICAgICB0aGlzKGZvbnQsIGFudGlhbGlhc2VkLCB1c2VGcmFjdGlvbmFs
TWV0cmljcywgbnVsbCwgZmFsc2UpOwogICAgfQoKICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRS
ZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBGb250LCBzcGVjaWZpZWQgZm9udAogICAgICAgIHByb3Bl
cnRpZXMsIGFuZCBnaXZlbiBSZW5kZXJEZWxlZ2F0ZS4gVGhlCiAgICAgICAgPGNvZGU+YW50aWFs
aWFzZWQ8L2NvZGU+IGFuZCA8Y29kZT51c2VGcmFjdGlvbmFsTWV0cmljczwvY29kZT4KICAgICAg
ICBmbGFncyBwcm92aWRlIGNvbnRyb2wgb3ZlciB0aGUgc2FtZSBwcm9wZXJ0aWVzIGF0IHRoZSBK
YXZhIDJECiAgICAgICAgbGV2ZWwuIFRoZSA8Y29kZT5yZW5kZXJEZWxlZ2F0ZTwvY29kZT4gcHJv
dmlkZXMgbW9yZSBjb250cm9sCiAgICAgICAgb3ZlciB0aGUgdGV4dCByZW5kZXJlZC4gTm8gbWlw
bWFwIHN1cHBvcnQgaXMgcmVxdWVzdGVkLgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0
byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJhbSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBh
bnRpYWxpYXNlZCBmb250cwogICAgICAgIEBwYXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0
aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQKICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJE
IGxldmVsCiAgICAgICAgQHBhcmFtIHJlbmRlckRlbGVnYXRlIHRoZSByZW5kZXIgZGVsZWdhdGUg
dG8gdXNlIHRvIGRyYXcgdGhlCiAgICAgICAgdGV4dCdzIGJpdG1hcCwgb3IgbnVsbCB0byB1c2Ug
dGhlIGRlZmF1bHQgb25lCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQs
IGJvb2xlYW4gYW50aWFsaWFzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNl
RnJhY3Rpb25hbE1ldHJpY3MsIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlKSB7CiAgICAg
ICAgdGhpcyhmb250LCBhbnRpYWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJpY3MsIHJlbmRlckRl
bGVnYXRlLCBmYWxzZSk7CiAgICB9CgogICAgLyoqIENyZWF0ZXMgYSBuZXcgVGV4dFJlbmRlcmVy
IHdpdGggdGhlIGdpdmVuIEZvbnQsIHNwZWNpZmllZCBmb250CiAgICAgICAgcHJvcGVydGllcywg
YW5kIGdpdmVuIFJlbmRlckRlbGVnYXRlLiBUaGUKICAgICAgICA8Y29kZT5hbnRpYWxpYXNlZDwv
Y29kZT4gYW5kIDxjb2RlPnVzZUZyYWN0aW9uYWxNZXRyaWNzPC9jb2RlPgogICAgICAgIGZsYWdz
IHByb3ZpZGUgY29udHJvbCBvdmVyIHRoZSBzYW1lIHByb3BlcnRpZXMgYXQgdGhlIEphdmEgMkQK
ICAgICAgICBsZXZlbC4gVGhlIDxjb2RlPnJlbmRlckRlbGVnYXRlPC9jb2RlPiBwcm92aWRlcyBt
b3JlIGNvbnRyb2wKICAgICAgICBvdmVyIHRoZSB0ZXh0IHJlbmRlcmVkLiBJZiA8Q09ERT5taXBt
YXA8L0NPREU+IGlzIHRydWUsIGF0dGVtcHRzCiAgICAgICAgdG8gdXNlIE9wZW5HTCdzIGF1dG9t
YXRpYyBtaXBtYXAgZ2VuZXJhdGlvbiBmb3IgYmV0dGVyIHNtb290aGluZwogICAgICAgIHdoZW4g
cmVuZGVyaW5nIHRoZSBUZXh0dXJlUmVuZGVyZXIncyBjb250ZW50cyBhdCBhIGRpc3RhbmNlLgoK
ICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJh
bSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBhbnRpYWxpYXNlZCBmb250cwogICAgICAgIEBw
YXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQK
ICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJEIGxldmVsCiAgICAgICAgQHBhcmFtIHJlbmRl
ckRlbGVnYXRlIHRoZSByZW5kZXIgZGVsZWdhdGUgdG8gdXNlIHRvIGRyYXcgdGhlCiAgICAgICAg
dGV4dCdzIGJpdG1hcCwgb3IgbnVsbCB0byB1c2UgdGhlIGRlZmF1bHQgb25lCiAgICAgICAgQHBh
cmFtIG1pcG1hcCB3aGV0aGVyIHRvIGF0dGVtcHQgdXNlIG9mIGF1dG9tYXRpYyBtaXBtYXAgZ2Vu
ZXJhdGlvbgogICAgKi8KICAgIHB1YmxpYyBUZXh0UmVuZGVyZXIoRm9udCBmb250LCBib29sZWFu
IGFudGlhbGlhc2VkLAogICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUZyYWN0aW9u
YWxNZXRyaWNzLCBSZW5kZXJEZWxlZ2F0ZSByZW5kZXJEZWxlZ2F0ZSwKICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vbGVhbiBtaXBtYXApIHsKICAgICAgICB0aGlzLmZvbnQgPSBmb250OwogICAg
ICAgIHRoaXMuYW50aWFsaWFzZWQgPSBhbnRpYWxpYXNlZDsKICAgICAgICB0aGlzLnVzZUZyYWN0
aW9uYWxNZXRyaWNzID0gdXNlRnJhY3Rpb25hbE1ldHJpY3M7CiAgICAgICAgdGhpcy5taXBtYXAg
PSBtaXBtYXA7CgogICAgICAgIC8vIEZJWE1FOiBjb25zaWRlciBhZGp1c3RpbmcgdGhlIHNpemUg
YmFzZWQgb24gZm9udCBzaXplCiAgICAgICAgLy8gKGl0IHdpbGwgYWxyZWFkeSBhdXRvbWF0aWNh
bGx5IHJlc2l6ZSBpZiBuZWNlc3NhcnkpCiAgICAgICAgcGFja2VyID0gbmV3IFJlY3RhbmdsZVBh
Y2tlcihuZXcgTWFuYWdlcigpLCBrU2l6ZSwga1NpemUpOwoKICAgICAgICBpZiAocmVuZGVyRGVs
ZWdhdGUgPT0gbnVsbCkgewogICAgICAgICAgICByZW5kZXJEZWxlZ2F0ZSA9IG5ldyBEZWZhdWx0
UmVuZGVyRGVsZWdhdGUoKTsKICAgICAgICB9CgogICAgICAgIHRoaXMucmVuZGVyRGVsZWdhdGUg
PSByZW5kZXJEZWxlZ2F0ZTsKCiAgICAgICAgbUdseXBoUHJvZHVjZXIgPSBuZXcgR2x5cGhQcm9k
dWNlcihmb250LmdldE51bUdseXBocygpKTsKICAgIH0KCiAgICAvKiogUmV0dXJucyB0aGUgYm91
bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBnaXZlbiBTdHJpbmcsIGFzc3VtaW5nIGl0CiAgICAgICAg
d2FzIHJlbmRlcmVkIGF0IHRoZSBvcmlnaW4uIFNlZSB7QGxpbmsgI2dldEJvdW5kcyhDaGFyU2Vx
dWVuY2UpCiAgICAgICAgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSl9LiAqLwogICAgcHVibGljIFJl
Y3RhbmdsZTJEIGdldEJvdW5kcyhTdHJpbmcgc3RyKSB7CiAgICAgICAgcmV0dXJuIGdldEJvdW5k
cygoQ2hhclNlcXVlbmNlKSBzdHIpOwogICAgfQoKICAgIC8qKiBSZXR1cm5zIHRoZSBib3VuZGlu
ZyByZWN0YW5nbGUgb2YgdGhlIGdpdmVuIENoYXJTZXF1ZW5jZSwKICAgICAgICBhc3N1bWluZyBp
dCB3YXMgcmVuZGVyZWQgYXQgdGhlIG9yaWdpbi4gVGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mCiAg
ICAgICAgdGhlIHJldHVybmVkIHJlY3RhbmdsZSBpcyBKYXZhIDJEJ3MsIHdpdGggaW5jcmVhc2lu
ZyBZCiAgICAgICAgY29vcmRpbmF0ZXMgaW4gdGhlIGRvd253YXJkIGRpcmVjdGlvbi4gVGhlIHJl
bGF0aXZlIGNvb3JkaW5hdGUKICAgICAgICAoMCwgMCkgaW4gdGhlIHJldHVybmVkIHJlY3Rhbmds
ZSBjb3JyZXNwb25kcyB0byB0aGUgYmFzZWxpbmUgb2YKICAgICAgICB0aGUgbGVmdG1vc3QgY2hh
cmFjdGVyIG9mIHRoZSByZW5kZXJlZCBzdHJpbmcsIGluIHNpbWlsYXIKICAgICAgICBmYXNoaW9u
IHRvIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5LCBmb3IgZXhhbXBsZSwge0BsaW5rCiAgICAgICAg
amF2YS5hd3QuZm9udC5HbHlwaFZlY3RvciNnZXRWaXN1YWxCb3VuZHN9LiBNb3N0IGFwcGxpY2F0
aW9ucwogICAgICAgIHdpbGwgdXNlIG9ubHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHJl
dHVybmVkIFJlY3RhbmdsZSBmb3IKICAgICAgICB0aGUgcHVycG9zZXMgb2YgY2VudGVyaW5nIG9y
IGp1c3RpZnlpbmcgdGhlIFN0cmluZy4gSXQgaXMgbm90CiAgICAgICAgc3BlY2lmaWVkIHdoaWNo
IEphdmEgMkQgYm91bmRzICh7QGxpbmsKICAgICAgICBqYXZhLmF3dC5mb250LkdseXBoVmVjdG9y
I2dldFZpc3VhbEJvdW5kcyBnZXRWaXN1YWxCb3VuZHN9LAogICAgICAgIHtAbGluayBqYXZhLmF3
dC5mb250LkdseXBoVmVjdG9yI2dldFBpeGVsQm91bmRzIGdldFBpeGVsQm91bmRzfSwKICAgICAg
ICBldGMuKSB0aGUgcmV0dXJuZWQgYm91bmRzIGNvcnJlc3BvbmQgdG8sIGFsdGhvdWdoIGV2ZXJ5
IGVmZm9ydAogICAgICAgIGlzIG1hZGUgdG8gZW5zdXJlIGFuIGFjY3VyYXRlIGJvdW5kLiAqLwog
ICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kcyhDaGFyU2VxdWVuY2Ugc3RyKSB7CiAgICAg
ICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIG1vcmUgb3B0aW1pemVkIGFuZCB1c2UgdGhlIGds
eXBoIGNhY2hlCiAgICAgICAgUmVjdCByID0gbnVsbDsKCiAgICAgICAgaWYgKChyID0gKFJlY3Qp
IHN0cmluZ0xvY2F0aW9ucy5nZXQoc3RyKSkgIT0gbnVsbCkgewogICAgICAgICAgICBUZXh0RGF0
YSBkYXRhID0gKFRleHREYXRhKSByLmdldFVzZXJEYXRhKCk7CgogICAgICAgICAgICAvLyBSZWNv
bnN0aXR1dGUgdGhlIEphdmEgMkQgcmVzdWx0cyBiYXNlZCBvbiB0aGUgY2FjaGVkIHZhbHVlcwog
ICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZTJELkRvdWJsZSgtZGF0YS5vcmlnaW4oKS54
LCAtZGF0YS5vcmlnaW4oKS55LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByLncoKSwgci5oKCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gTXVzdCByZXR1cm4gYSBS
ZWN0YW5nbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBsYXlvdXQgYWxnb3JpdGhtIC0tCiAgICAgICAg
Ly8gbXVzdCBiZSBpZGVtcG90ZW50CiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShyZW5kZXJEZWxl
Z2F0ZS5nZXRCb3VuZHMoc3RyLCBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGdldEZvbnRSZW5kZXJDb250ZXh0KCkpKTsKICAgIH0KCiAgICAv
KiogUmV0dXJucyB0aGUgRm9udCB0aGlzIHJlbmRlcmVyIGlzIHVzaW5nLiAqLwogICAgcHVibGlj
IEZvbnQgZ2V0Rm9udCgpIHsKICAgICAgICByZXR1cm4gZm9udDsKICAgIH0KCiAgICAvKiogUmV0
dXJucyBhIEZvbnRSZW5kZXJDb250ZXh0IHdoaWNoIGNhbiBiZSB1c2VkIGZvciBleHRlcm5hbAog
ICAgICAgIHRleHQtcmVsYXRlZCBzaXplIGNvbXB1dGF0aW9ucy4gVGhpcyBvYmplY3Qgc2hvdWxk
IGJlIGNvbnNpZGVyZWQKICAgICAgICB0cmFuc2llbnQgYW5kIG1heSBiZWNvbWUgaW52YWxpZGF0
ZWQgYmV0d2VlbiB7QGxpbmsKICAgICAgICAjYmVnaW5SZW5kZXJpbmcgYmVnaW5SZW5kZXJpbmd9
IC8ge0BsaW5rICNlbmRSZW5kZXJpbmcKICAgICAgICBlbmRSZW5kZXJpbmd9IHBhaXJzLiAqLwog
ICAgcHVibGljIEZvbnRSZW5kZXJDb250ZXh0IGdldEZvbnRSZW5kZXJDb250ZXh0KCkgewogICAg
ICAgIGlmIChjYWNoZWRGb250UmVuZGVyQ29udGV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgIGNh
Y2hlZEZvbnRSZW5kZXJDb250ZXh0ID0gZ2V0R3JhcGhpY3MyRCgpLmdldEZvbnRSZW5kZXJDb250
ZXh0KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2FjaGVkRm9udFJlbmRlckNvbnRleHQ7
CiAgICB9CgogICAgLyoqIEJlZ2lucyByZW5kZXJpbmcgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVu
ZGVyZXIgVGV4dFJlbmRlcmVyfQogICAgICAgIGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdh
YmxlLCBwdXNoaW5nIHRoZSBwcm9qZWN0aW9uIGFuZAogICAgICAgIG1vZGVsdmlldyBtYXRyaWNl
cyBhbmQgc29tZSBzdGF0ZSBiaXRzIGFuZCBzZXR0aW5nIHVwIGEKICAgICAgICB0d28tZGltZW5z
aW9uYWwgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gd2l0aCAoMCwgMCkgYXMgdGhlCiAgICAgICAg
bG93ZXItbGVmdCBjb29yZGluYXRlIGFuZCAod2lkdGgsIGhlaWdodCkgYXMgdGhlIHVwcGVyLXJp
Z2h0CiAgICAgICAgY29vcmRpbmF0ZS4gQmluZHMgYW5kIGVuYWJsZXMgdGhlIGludGVybmFsIE9w
ZW5HTCB0ZXh0dXJlCiAgICAgICAgb2JqZWN0LCBzZXRzIHRoZSB0ZXh0dXJlIGVudmlyb25tZW50
IG1vZGUgdG8gR0xfTU9EVUxBVEUsIGFuZAogICAgICAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgY29s
b3IgdG8gdGhlIGxhc3QgY29sb3Igc2V0IHdpdGggdGhpcwogICAgICAgIFRleHRSZW5kZXJlciB2
aWEge0BsaW5rICNzZXRDb2xvciBzZXRDb2xvcn0uIFRoaXMgbWV0aG9kCiAgICAgICAgZGlzYWJs
ZXMgdGhlIGRlcHRoIHRlc3QgYW5kIGlzIGVxdWl2YWxlbnQgdG8KICAgICAgICBiZWdpblJlbmRl
cmluZyh3aWR0aCwgaGVpZ2h0LCB0cnVlKS4KCiAgICAgICAgQHBhcmFtIHdpZHRoIHRoZSB3aWR0
aCBvZiB0aGUgY3VycmVudCBvbi1zY3JlZW4gT3BlbkdMIGRyYXdhYmxlCiAgICAgICAgQHBhcmFt
IGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBjdXJyZW50IG9uLXNjcmVlbiBPcGVuR0wgZHJhd2Fi
bGUKICAgICAgICBAdGhyb3dzIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV4Y2VwdGlvbiBJZiBhbiBP
cGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAog
ICAgKi8KICAgIHB1YmxpYyB2b2lkIGJlZ2luUmVuZGVyaW5nKGludCB3aWR0aCwgaW50IGhlaWdo
dCkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBiZWdpblJlbmRlcmluZyh3aWR0aCwgaGVp
Z2h0LCB0cnVlKTsKICAgIH0KCiAgICAvKiogQmVnaW5zIHJlbmRlcmluZyB3aXRoIHRoaXMge0Bs
aW5rIFRleHRSZW5kZXJlciBUZXh0UmVuZGVyZXJ9CiAgICAgICAgaW50byB0aGUgY3VycmVudCBP
cGVuR0wgZHJhd2FibGUsIHB1c2hpbmcgdGhlIHByb2plY3Rpb24gYW5kCiAgICAgICAgbW9kZWx2
aWV3IG1hdHJpY2VzIGFuZCBzb21lIHN0YXRlIGJpdHMgYW5kIHNldHRpbmcgdXAgYQogICAgICAg
IHR3by1kaW1lbnNpb25hbCBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiB3aXRoICgwLCAwKSBhcyB0
aGUKICAgICAgICBsb3dlci1sZWZ0IGNvb3JkaW5hdGUgYW5kICh3aWR0aCwgaGVpZ2h0KSBhcyB0
aGUgdXBwZXItcmlnaHQKICAgICAgICBjb29yZGluYXRlLiBCaW5kcyBhbmQgZW5hYmxlcyB0aGUg
aW50ZXJuYWwgT3BlbkdMIHRleHR1cmUKICAgICAgICBvYmplY3QsIHNldHMgdGhlIHRleHR1cmUg
ZW52aXJvbm1lbnQgbW9kZSB0byBHTF9NT0RVTEFURSwgYW5kCiAgICAgICAgY2hhbmdlcyB0aGUg
Y3VycmVudCBjb2xvciB0byB0aGUgbGFzdCBjb2xvciBzZXQgd2l0aCB0aGlzCiAgICAgICAgVGV4
dFJlbmRlcmVyIHZpYSB7QGxpbmsgI3NldENvbG9yIHNldENvbG9yfS4gRGlzYWJsZXMgdGhlIGRl
cHRoCiAgICAgICAgdGVzdCBpZiB0aGUgZGlzYWJsZURlcHRoVGVzdCBhcmd1bWVudCBpcyB0cnVl
LgoKICAgICAgICBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBjdXJyZW50IG9uLXNjcmVl
biBPcGVuR0wgZHJhd2FibGUKICAgICAgICBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhl
IGN1cnJlbnQgb24tc2NyZWVuIE9wZW5HTCBkcmF3YWJsZQogICAgICAgIEBwYXJhbSBkaXNhYmxl
RGVwdGhUZXN0IHdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgZGVwdGggdGVzdAogICAgICAgIEB0aHJv
d3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBiZWdpblJlbmRlcmlu
ZyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gZGlzYWJsZURlcHRoVGVzdCkKICAgICAg
ICB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGJlZ2luUmVuZGVyaW5nKHRydWUsIHdpZHRo
LCBoZWlnaHQsIGRpc2FibGVEZXB0aFRlc3QpOwogICAgfQoKICAgIC8qKiBCZWdpbnMgcmVuZGVy
aW5nIG9mIDJEIHRleHQgaW4gM0Qgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIKICAgICAg
ICBUZXh0UmVuZGVyZXJ9IGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdhYmxlLiBBc3N1bWVz
IHRoZSBlbmQKICAgICAgICB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHVwIHRoZSBt
b2RlbHZpZXcgYW5kIHByb2plY3Rpb24KICAgICAgICBtYXRyaWNlcywgYW5kIHdpbGwgcmVuZGVy
IHRleHQgdXNpbmcgdGhlIHtAbGluayAjZHJhdzNEIGRyYXczRH0KICAgICAgICBtZXRob2QuIFRo
aXMgbWV0aG9kIHB1c2hlcyBzb21lIE9wZW5HTCBzdGF0ZSBiaXRzLCBiaW5kcyBhbmQKICAgICAg
ICBlbmFibGVzIHRoZSBpbnRlcm5hbCBPcGVuR0wgdGV4dHVyZSBvYmplY3QsIHNldHMgdGhlIHRl
eHR1cmUKICAgICAgICBlbnZpcm9ubWVudCBtb2RlIHRvIEdMX01PRFVMQVRFLCBhbmQgY2hhbmdl
cyB0aGUgY3VycmVudCBjb2xvcgogICAgICAgIHRvIHRoZSBsYXN0IGNvbG9yIHNldCB3aXRoIHRo
aXMgVGV4dFJlbmRlcmVyIHZpYSB7QGxpbmsKICAgICAgICAjc2V0Q29sb3Igc2V0Q29sb3J9LgoK
ICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBj
dXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQg
YmVnaW4zRFJlbmRlcmluZygpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgYmVnaW5SZW5k
ZXJpbmcoZmFsc2UsIDAsIDAsIGZhbHNlKTsKICAgIH0KCiAgICAvKiogQ2hhbmdlcyB0aGUgY3Vy
cmVudCBjb2xvciBvZiB0aGlzIFRleHRSZW5kZXJlciB0byB0aGUgc3VwcGxpZWQKICAgICAgICBv
bmUuIFRoZSBkZWZhdWx0IGNvbG9yIGlzIG9wYXF1ZSB3aGl0ZS4KCiAgICAgICAgQHBhcmFtIGNv
bG9yIHRoZSBuZXcgY29sb3IgdG8gdXNlIGZvciByZW5kZXJpbmcgdGV4dAogICAgICAgIEB0aHJv
d3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihDb2xv
ciBjb2xvcikgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBib29sZWFuIG5vTmVlZEZvckZs
dXNoID0gKGhhdmVDYWNoZWRDb2xvciAmJiAoY2FjaGVkQ29sb3IgIT0gbnVsbCkgJiYKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLmVxdWFscyhjYWNoZWRDb2xvcikpOwoK
ICAgICAgICBpZiAoIW5vTmVlZEZvckZsdXNoKSB7CiAgICAgICAgICAgIGZsdXNoR2x5cGhQaXBl
bGluZSgpOwogICAgICAgIH0KCiAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuc2V0Q29sb3IoY29s
b3IpOwogICAgICAgIGhhdmVDYWNoZWRDb2xvciA9IHRydWU7CiAgICAgICAgY2FjaGVkQ29sb3Ig
PSBjb2xvcjsKICAgIH0KCiAgICAvKiogQ2hhbmdlcyB0aGUgY3VycmVudCBjb2xvciBvZiB0aGlz
IFRleHRSZW5kZXJlciB0byB0aGUgc3VwcGxpZWQKICAgICAgICBvbmUsIHdoZXJlIGVhY2ggY29t
cG9uZW50IHJhbmdlcyBmcm9tIDAuMGYgLSAxLjBmLiBUaGUgYWxwaGEKICAgICAgICBjb21wb25l
bnQsIGlmIHVzZWQsIGRvZXMgbm90IG5lZWQgdG8gYmUgcHJlbXVsdGlwbGllZCBpbnRvIHRoZQog
ICAgICAgIGNvbG9yIGNoYW5uZWxzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBm
b3Ige0BsaW5rCiAgICAgICAgY29tLnN1bi5vcGVuZ2wudXRpbC50ZXh0dXJlLlRleHR1cmUgVGV4
dHVyZX0sIGFsdGhvdWdoCiAgICAgICAgcHJlbXVsdGlwbGllZCBjb2xvcnMgYXJlIHVzZWQgaW50
ZXJuYWxseS4gVGhlIGRlZmF1bHQgY29sb3IgaXMKICAgICAgICBvcGFxdWUgd2hpdGUuCgogICAg
ICAgIEBwYXJhbSByIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3IKICAgICAgICBA
cGFyYW0gZyB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3IKICAgICAgICBAcGFy
YW0gYiB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIG5ldyBjb2xvcgogICAgICAgIEBwYXJhbSBh
IHRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIG5ldyBjb2xvciwgMC4wZiA9IGNvbXBsZXRlbHkK
ICAgICAgICB0cmFuc3BhcmVudCwgMS4wZiA9IGNvbXBsZXRlbHkgb3BhcXVlCiAgICAgICAgQHRo
cm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVu
IHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZs
b2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCiAgICAgICAgdGhyb3dzIEdMRXhjZXB0
aW9uIHsKICAgICAgICBib29sZWFuIG5vTmVlZEZvckZsdXNoID0gKGhhdmVDYWNoZWRDb2xvciAm
JiAoY2FjaGVkQ29sb3IgPT0gbnVsbCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChyID09IGNhY2hlZFIpICYmIChnID09IGNhY2hlZEcpICYmIChiID09IGNhY2hlZEIpICYm
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSA9PSBjYWNoZWRBKSk7CgogICAg
ICAgIGlmICghbm9OZWVkRm9yRmx1c2gpIHsKICAgICAgICAgICAgZmx1c2hHbHlwaFBpcGVsaW5l
KCk7CiAgICAgICAgfQoKICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xvcihyLCBnLCBi
LCBhKTsKICAgICAgICBoYXZlQ2FjaGVkQ29sb3IgPSB0cnVlOwogICAgICAgIGNhY2hlZFIgPSBy
OwogICAgICAgIGNhY2hlZEcgPSBnOwogICAgICAgIGNhY2hlZEIgPSBiOwogICAgICAgIGNhY2hl
ZEEgPSBhOwogICAgICAgIGNhY2hlZENvbG9yID0gbnVsbDsKICAgIH0KCiAgICAvKiogRHJhd3Mg
dGhlIHN1cHBsaWVkIENoYXJTZXF1ZW5jZSBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiB1c2luZwog
ICAgICAgIHRoZSByZW5kZXJlcidzIGN1cnJlbnQgY29sb3IuIFRoZSBiYXNlbGluZSBvZiB0aGUg
bGVmdG1vc3QKICAgICAgICBjaGFyYWN0ZXIgaXMgYXQgcG9zaXRpb24gKHgsIHkpIHNwZWNpZmll
ZCBpbiBPcGVuR0wgY29vcmRpbmF0ZXMsCiAgICAgICAgd2hlcmUgdGhlIG9yaWdpbiBpcyBhdCB0
aGUgbG93ZXItbGVmdCBvZiB0aGUgZHJhd2FibGUgYW5kIHRoZSBZCiAgICAgICAgY29vcmRpbmF0
ZSBpbmNyZWFzZXMgaW4gdGhlIHVwd2FyZCBkaXJlY3Rpb24uCgogICAgICAgIEBwYXJhbSBzdHIg
dGhlIHN0cmluZyB0byBkcmF3CiAgICAgICAgQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBhdCB3
aGljaCB0byBkcmF3CiAgICAgICAgQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBhdCB3aGljaCB0
byBkcmF3CiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBp
cyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1Ymxp
YyB2b2lkIGRyYXcoQ2hhclNlcXVlbmNlIHN0ciwgaW50IHgsIGludCB5KSB0aHJvd3MgR0xFeGNl
cHRpb24gewogICAgICAgIGRyYXczRChzdHIsIHgsIHksIDAsIDEpOwogICAgfQoKICAgIC8qKiBE
cmF3cyB0aGUgc3VwcGxpZWQgU3RyaW5nIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIHVzaW5nIHRo
ZQogICAgICAgIHJlbmRlcmVyJ3MgY3VycmVudCBjb2xvci4gU2VlIHtAbGluayAjZHJhdyhDaGFy
U2VxdWVuY2UsIGludCwKICAgICAgICBpbnQpIGRyYXcoQ2hhclNlcXVlbmNlLCBpbnQsIGludCl9
LiAqLwogICAgcHVibGljIHZvaWQgZHJhdyhTdHJpbmcgc3RyLCBpbnQgeCwgaW50IHkpIHRocm93
cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgZHJhdzNEKHN0ciwgeCwgeSwgMCwgMSk7CiAgICB9Cgog
ICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBDaGFyU2VxdWVuY2UgYXQgdGhlIGRlc2lyZWQgM0Qg
bG9jYXRpb24gdXNpbmcKICAgICAgICB0aGUgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9yLiBUaGUg
YmFzZWxpbmUgb2YgdGhlIGxlZnRtb3N0CiAgICAgICAgY2hhcmFjdGVyIGlzIHBsYWNlZCBhdCBw
b3NpdGlvbiAoeCwgeSwgeikgaW4gdGhlIGN1cnJlbnQKICAgICAgICBjb29yZGluYXRlIHN5c3Rl
bS4KCiAgICAgICAgQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGRyYXcKICAgICAgICBAcGFyYW0g
eCB0aGUgeCBjb29yZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0geSB0aGUg
eSBjb29yZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0geiB0aGUgeiBjb29y
ZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0gc2NhbGVGYWN0b3IgYSB1bmlm
b3JtIHNjYWxlIGZhY3RvciBhcHBsaWVkIHRvIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBk
cmF3biByZWN0YW5nbGUKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBj
b250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwog
ICAgcHVibGljIHZvaWQgZHJhdzNEKENoYXJTZXF1ZW5jZSBzdHIsIGZsb2F0IHgsIGZsb2F0IHks
IGZsb2F0IHosCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAg
ICAgICBpbnRlcm5hbF9kcmF3M0Qoc3RyLCB4LCB5LCB6LCBzY2FsZUZhY3Rvcik7CiAgICB9Cgog
ICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBTdHJpbmcgYXQgdGhlIGRlc2lyZWQgM0QgbG9jYXRp
b24gdXNpbmcgdGhlCiAgICAgICAgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9yLiBTZWUge0BsaW5r
ICNkcmF3M0QoQ2hhclNlcXVlbmNlLAogICAgICAgIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0
KSBkcmF3M0QoQ2hhclNlcXVlbmNlLCBmbG9hdCwgZmxvYXQsCiAgICAgICAgZmxvYXQsIGZsb2F0
KX0uICovCiAgICBwdWJsaWMgdm9pZCBkcmF3M0QoU3RyaW5nIHN0ciwgZmxvYXQgeCwgZmxvYXQg
eSwgZmxvYXQgeiwgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAgICAgICBpbnRlcm5hbF9kcmF3M0Qo
c3RyLCB4LCB5LCB6LCBzY2FsZUZhY3Rvcik7CiAgICB9CgogICAgLyoqIFJldHVybnMgdGhlIHBp
eGVsIHdpZHRoIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIuICovCiAgICBwdWJsaWMgZmxvYXQgZ2V0
Q2hhcldpZHRoKGNoYXIgaW5DaGFyKSB7CiAgICAgICAgcmV0dXJuIG1HbHlwaFByb2R1Y2VyLmdl
dEdseXBoUGl4ZWxXaWR0aChpbkNoYXIpOwogICAgfQoKICAgIC8qKiBDYXVzZXMgdGhlIFRleHRS
ZW5kZXJlciB0byBmbHVzaCBhbnkgaW50ZXJuYWwgY2FjaGVzIGl0IG1heSBiZQogICAgICAgIG1h
aW50YWluaW5nIGFuZCBkcmF3IGl0cyByZW5kZXJpbmcgcmVzdWx0cyB0byB0aGUgc2NyZWVuLiBU
aGlzCiAgICAgICAgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBlYWNoIGNhbGwgdG8gZHJhdygpIGlm
IHlvdSBhcmUgc2V0dGluZwogICAgICAgIE9wZW5HTCBzdGF0ZSBzdWNoIGFzIHRoZSBtb2RlbHZp
ZXcgbWF0cml4IGJldHdlZW4gY2FsbHMgdG8KICAgICAgICBkcmF3KCkuICovCiAgICBwdWJsaWMg
dm9pZCBmbHVzaCgpIHsKICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUoKTsKICAgIH0KCiAgICAv
KiogRW5kcyBhIHJlbmRlciBjeWNsZSB3aXRoIHRoaXMge0BsaW5rIFRleHRSZW5kZXJlciBUZXh0
UmVuZGVyZXJ9LgogICAgICAgIFJlc3RvcmVzIHRoZSBwcm9qZWN0aW9uIGFuZCBtb2RlbHZpZXcg
bWF0cmljZXMgYXMgd2VsbCBhcwogICAgICAgIHNldmVyYWwgT3BlbkdMIHN0YXRlIGJpdHMuIFNo
b3VsZCBiZSBwYWlyZWQgd2l0aCB7QGxpbmsKICAgICAgICAjYmVnaW5SZW5kZXJpbmcgYmVnaW5S
ZW5kZXJpbmd9LgoKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250
ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAg
cHVibGljIHZvaWQgZW5kUmVuZGVyaW5nKCkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBl
bmRSZW5kZXJpbmcodHJ1ZSk7CiAgICB9CgogICAgLyoqIEVuZHMgYSAzRCByZW5kZXIgY3ljbGUg
d2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIgVGV4dFJlbmRlcmVyfS4KICAgICAgICBSZXN0
b3JlcyBzZXZlcmFsIE9wZW5HTCBzdGF0ZSBiaXRzLiBTaG91bGQgYmUgcGFpcmVkIHdpdGgge0Bs
aW5rCiAgICAgICAgI2JlZ2luM0RSZW5kZXJpbmcgYmVnaW4zRFJlbmRlcmluZ30uCgogICAgICAg
IEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQg
d2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBlbmQzRFJl
bmRlcmluZygpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgZW5kUmVuZGVyaW5nKGZhbHNl
KTsKICAgIH0KCiAgICAvKiogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyB0aGlzIFRleHRSZW5k
ZXJlciBpcyB1c2luZy4gSXQgaXMgbm90CiAgICAgICAgdmFsaWQgdG8gdXNlIHRoZSBUZXh0UmVu
ZGVyZXIgYWZ0ZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgoKICAgICAgICBAdGhyb3dzIEdMRXhj
ZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRo
b2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHRocm93cyBHTEV4
Y2VwdGlvbiB7CiAgICAgICAgcGFja2VyLmRpc3Bvc2UoKTsKICAgICAgICBwYWNrZXIgPSBudWxs
OwogICAgICAgIGNhY2hlZEJhY2tpbmdTdG9yZSA9IG51bGw7CiAgICAgICAgY2FjaGVkR3JhcGhp
Y3MgPSBudWxsOwogICAgICAgIGNhY2hlZEZvbnRSZW5kZXJDb250ZXh0ID0gbnVsbDsKCiAgICAg
ICAgaWYgKGRiZ0ZyYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgZGJnRnJhbWUuZGlzcG9zZSgp
OwogICAgICAgIH0KICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEludGVybmFscyBv
bmx5IGJlbG93IHRoaXMgcG9pbnQKICAgIC8vCgogICAgcHJpdmF0ZSBzdGF0aWMgUmVjdGFuZ2xl
MkQgcHJlTm9ybWFsaXplKFJlY3RhbmdsZTJEIHNyYykgewogICAgICAgIC8vIE5lZWQgdG8gcm91
bmQgdG8gaW50ZWdlciBjb29yZGluYXRlcwogICAgICAgIC8vIEFsc28gZ2l2ZSBvdXJzZWx2ZXMg
YSBsaXR0bGUgc2xvcCBhcm91bmQgdGhlIHJlcG9ydGVkCiAgICAgICAgLy8gYm91bmRzIG9mIGds
eXBocyBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgbmVpdGhlciB0aGUgdmlzdWFsCiAgICAgICAgLy8g
bm9yIHRoZSBwaXhlbCBib3VuZHMgd29ya3MgcGVyZmVjdGx5IHdlbGwKICAgICAgICBpbnQgbWlu
WCA9IChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblgoKSkgLSAxOwogICAgICAgIGludCBtaW5Z
ID0gKGludCkgTWF0aC5mbG9vcihzcmMuZ2V0TWluWSgpKSAtIDE7CiAgICAgICAgaW50IG1heFgg
PSAoaW50KSBNYXRoLmNlaWwoc3JjLmdldE1heFgoKSkgKyAxOwogICAgICAgIGludCBtYXhZID0g
KGludCkgTWF0aC5jZWlsKHNyYy5nZXRNYXhZKCkpICsgMTsKICAgICAgICByZXR1cm4gbmV3IFJl
Y3RhbmdsZTJELkRvdWJsZShtaW5YLCBtaW5ZLCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpOwog
ICAgfQoKCiAgICBwcml2YXRlIFJlY3RhbmdsZTJEIG5vcm1hbGl6ZShSZWN0YW5nbGUyRCBzcmMp
IHsKICAgICAgICAvLyBHaXZlIG91cnNlbHZlcyBhIGJvdW5kYXJ5IGFyb3VuZCBlYWNoIGVudGl0
eSBvbiB0aGUgYmFja2luZwogICAgICAgIC8vIHN0b3JlIGluIG9yZGVyIHRvIHByZXZlbnQgYmxl
ZWRpbmcgb2YgbmVhcmJ5IFN0cmluZ3MgZHVlIHRvCiAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3
ZSB1c2UgbGluZWFyIGZpbHRlcmluZwoKICAgICAgICAvLyBOT1RFIHRoYXQgdGhpcyBib3VuZGFy
eSBpcyBxdWl0ZSBoZXVyaXN0aWMgYW5kIGlzIHJlbGF0ZWQKICAgICAgICAvLyB0byBob3cgZmFy
IGF3YXkgaW4gM0Qgd2UgbWF5IHZpZXcgdGhlIHRleHQgLS0KICAgICAgICAvLyBoZXVyaXN0aWNh
bGx5LCAxLjUlIG9mIHRoZSBmb250J3MgaGVpZ2h0CiAgICAgICAgaW50IGJvdW5kYXJ5ID0gKGlu
dCkgTWF0aC5tYXgoMSwgMC4wMTUgKiBmb250LmdldFNpemUoKSk7CgogICAgICAgIHJldHVybiBu
ZXcgUmVjdGFuZ2xlMkQuRG91YmxlKChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblgoKSAtIGJv
dW5kYXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRo
LmZsb29yKHNyYy5nZXRNaW5ZKCkgLSBib3VuZGFyeSksCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKHNyYy5nZXRXaWR0aCgpICsgMiAqIGJvdW5k
YXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmNl
aWwoc3JjLmdldEhlaWdodCgpKSArIDIgKiBib3VuZGFyeSk7CiAgICB9CgogICAgcHJpdmF0ZSBU
ZXh0dXJlUmVuZGVyZXIgZ2V0QmFja2luZ1N0b3JlKCkgewogICAgICAgIFRleHR1cmVSZW5kZXJl
ciByZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIpIHBhY2tlci5nZXRCYWNraW5nU3RvcmUoKTsK
CiAgICAgICAgaWYgKHJlbmRlcmVyICE9IGNhY2hlZEJhY2tpbmdTdG9yZSkgewogICAgICAgICAg
ICAvLyBCYWNraW5nIHN0b3JlIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lOyBkaXNjYXJkIGFueSBj
YWNoZWQgR3JhcGhpY3MyRAogICAgICAgICAgICBpZiAoY2FjaGVkR3JhcGhpY3MgIT0gbnVsbCkg
ewogICAgICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3MuZGlzcG9zZSgpOwogICAgICAgICAgICAg
ICAgY2FjaGVkR3JhcGhpY3MgPSBudWxsOwogICAgICAgICAgICAgICAgY2FjaGVkRm9udFJlbmRl
ckNvbnRleHQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWNoZWRCYWNraW5n
U3RvcmUgPSByZW5kZXJlcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjYWNoZWRCYWNraW5n
U3RvcmU7CiAgICB9CgogICAgcHJpdmF0ZSBHcmFwaGljczJEIGdldEdyYXBoaWNzMkQoKSB7CiAg
ICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CgogICAg
ICAgIGlmIChjYWNoZWRHcmFwaGljcyA9PSBudWxsKSB7CiAgICAgICAgICAgIGNhY2hlZEdyYXBo
aWNzID0gcmVuZGVyZXIuY3JlYXRlR3JhcGhpY3MoKTsKCiAgICAgICAgICAgIC8vIFNldCB1cCBj
b21wb3NpdGUsIGZvbnQgYW5kIHJlbmRlcmluZyBoaW50cwogICAgICAgICAgICBjYWNoZWRHcmFw
aGljcy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuU3JjKTsKICAgICAgICAgICAgY2FjaGVk
R3JhcGhpY3Muc2V0Q29sb3IoQ29sb3IuV0hJVEUpOwogICAgICAgICAgICBjYWNoZWRHcmFwaGlj
cy5zZXRGb250KGZvbnQpOwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdI
aW50KFJlbmRlcmluZ0hpbnRzLktFWV9URVhUX0FOVElBTElBU0lORywKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW50aWFsaWFzZWQgPyBSZW5kZXJpbmdIaW50
cy5WQUxVRV9URVhUX0FOVElBTElBU19PTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICA6IFJlbmRlcmluZ0hpbnRzLlZBTFVFX1RFWFRfQU5USUFMSUFTX09GRikp
OwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hp
bnRzLktFWV9GUkFDVElPTkFMTUVUUklDUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodXNlRnJhY3Rpb25hbE1ldHJpY3MKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgPyBSZW5kZXJpbmdIaW50cy5WQUxVRV9GUkFDVElPTkFM
TUVUUklDU19PTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6
IFJlbmRlcmluZ0hpbnRzLlZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09GRikpOwogICAgICAgIH0K
CiAgICAgICAgcmV0dXJuIGNhY2hlZEdyYXBoaWNzOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBi
ZWdpblJlbmRlcmluZyhib29sZWFuIG9ydGhvLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlRGVwdGhUZXN0Rm9yT3J0
aG8pIHsKICAgICAgICBpZiAoREVCVUcgJiYgIWRlYnVnZ2VkKSB7CiAgICAgICAgICAgIGRlYnVn
KCk7CiAgICAgICAgfQoKICAgICAgICBpbkJlZ2luRW5kUGFpciA9IHRydWU7CiAgICAgICAgaXNP
cnRob01vZGUgPSBvcnRobzsKICAgICAgICBiZWdpblJlbmRlcmluZ1dpZHRoID0gd2lkdGg7CiAg
ICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgYmVnaW5SZW5kZXJp
bmdEZXB0aFRlc3REaXNhYmxlZCA9IGRpc2FibGVEZXB0aFRlc3RGb3JPcnRobzsKCiAgICAgICAg
aWYgKG9ydGhvKSB7CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmJlZ2luT3J0aG9SZW5k
ZXJpbmcod2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0Rm9yT3J0aG8pOwogICAgICAgIH0gZWxzZSB7
CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmJlZ2luM0RSZW5kZXJpbmcoKTsKICAgICAg
ICB9CgogICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwoKICAgICAgICAvLyBQdXNo
IGNsaWVudCBhdHRyaWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgog
ICAgICAgIGdsLmdsUHVzaENsaWVudEF0dHJpYigoaW50KSBHTC5HTF9BTExfQ0xJRU5UX0FUVFJJ
Ql9CSVRTKTsKCiAgICAgICAgaWYgKCFoYXZlTWF4U2l6ZSkgewogICAgICAgICAgICAvLyBRdWVy
eSBPcGVuR0wgZm9yIHRoZSBtYXhpbXVtIHRleHR1cmUgc2l6ZSBhbmQgc2V0IGl0IGluIHRoZQog
ICAgICAgICAgICAvLyBSZWN0YW5nbGVQYWNrZXIgdG8ga2VlcCBpdCBmcm9tIGV4cGFuZGluZyB0
b28gbGFyZ2UKICAgICAgICAgICAgaW50W10gc3ogPSBuZXcgaW50WzFdOwogICAgICAgICAgICBn
bC5nbEdldEludGVnZXJ2KEdMLkdMX01BWF9URVhUVVJFX1NJWkUsIHN6LCAwKTsKICAgICAgICAg
ICAgcGFja2VyLnNldE1heFNpemUoc3pbMF0sIHN6WzBdKTsKICAgICAgICAgICAgaGF2ZU1heFNp
emUgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5lZWRUb1Jlc2V0Q29sb3IgJiYgaGF2
ZUNhY2hlZENvbG9yKSB7CiAgICAgICAgICAgIGlmIChjYWNoZWRDb2xvciA9PSBudWxsKSB7CiAg
ICAgICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xvcihjYWNoZWRSLCBjYWNoZWRH
LCBjYWNoZWRCLCBjYWNoZWRBKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAg
IGdldEJhY2tpbmdTdG9yZSgpLnNldENvbG9yKGNhY2hlZENvbG9yKTsKICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgbmVlZFRvUmVzZXRDb2xvciA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAg
Ly8gRGlzYWJsZSBmdXR1cmUgYXR0ZW1wdHMgdG8gdXNlIG1pcG1hcHBpbmcgaWYgVGV4dHVyZVJl
bmRlcmVyCiAgICAgICAgLy8gZG9lc24ndCBzdXBwb3J0IGl0CiAgICAgICAgaWYgKG1pcG1hcCAm
JiAhZ2V0QmFja2luZ1N0b3JlKCkuaXNVc2luZ0F1dG9NaXBtYXBHZW5lcmF0aW9uKCkpIHsKICAg
ICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4o
IkRpc2FibGVkIG1pcG1hcHBpbmcgaW4gVGV4dFJlbmRlcmVyIik7CiAgICAgICAgICAgIH0KCiAg
ICAgICAgICAgIG1pcG1hcCA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAq
IGVtemljOiBoZXJlIHRoZSBjYWxsIHRvIGdsQmluZEJ1ZmZlciBjcmFzaGVzIG9uIGNlcnRhaW4g
Z3JhcGhpY3NjYXJkL2RyaXZlciBjb21iaW5hdGlvbnMKICAgICAqIHRoaXMgaXMgd2h5IHRoZSB1
Z2x5IHRyeS1jYXRjaCBibG9jayBoYXMgYmVlbiBhZGRlZCwgd2hpY2ggZmFsbHMgYmFjayB0byB0
aGUgb2xkIHRleHRyZW5kZXJlcgogICAgICogCiAgICAgKiBAcGFyYW0gb3J0aG8KICAgICAqIEB0
aHJvd3MgR0xFeGNlcHRpb24KICAgICAqLwogICAgcHJpdmF0ZSB2b2lkIGVuZFJlbmRlcmluZyhi
b29sZWFuIG9ydGhvKSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGZsdXNoR2x5cGhQaXBl
bGluZSgpOwoKICAgICAgICBpbkJlZ2luRW5kUGFpciA9IGZhbHNlOwoKICAgICAgICBHTCBnbCA9
IEdMVS5nZXRDdXJyZW50R0woKTsKCiAgICAgICAgLy8gUG9wIGNsaWVudCBhdHRyaWIgYml0cyB1
c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgogICAgICAgIGdsLmdsUG9wQ2xpZW50
QXR0cmliKCk7CgogICAgICAgIC8vIFRoZSBPcGVuR0wgc3BlYyBpcyB1bmNsZWFyIGFib3V0IHdo
ZXRoZXIgdGhpcyBjaGFuZ2VzIHRoZQogICAgICAgIC8vIGJ1ZmZlciBiaW5kaW5ncywgc28gcHJl
ZW1wdGl2ZWx5IHplcm8gb3V0IHRoZSBHTF9BUlJBWV9CVUZGRVIKICAgICAgICAvLyBiaW5kaW5n
CiAgICAgICAgaWYgKGlzVkJPQXZhaWxhYmxlKGdsKSkgewogICAgICAgICAgICB0cnkgewogICAg
ICAgICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7CiAgICAg
ICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBpc0V4dGVuc2lv
bkF2YWlsYWJsZV9WQk8gPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAg
aWYgKG9ydGhvKSB7CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmVuZE9ydGhvUmVuZGVy
aW5nKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuZW5k
M0RSZW5kZXJpbmcoKTsKICAgICAgICB9CgogICAgICAgIGlmICgrK251bVJlbmRlckN5Y2xlcyA+
PSBDWUNMRVNfUEVSX0ZMVVNIKSB7CiAgICAgICAgICAgIG51bVJlbmRlckN5Y2xlcyA9IDA7Cgog
ICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRs
bigiQ2xlYXJpbmcgdW51c2VkIGVudHJpZXMgaW4gZW5kUmVuZGVyaW5nKCkiKTsKICAgICAgICAg
ICAgfQoKICAgICAgICAgICAgY2xlYXJVbnVzZWRFbnRyaWVzKCk7CiAgICAgICAgfQogICAgfQoK
ICAgIHByaXZhdGUgdm9pZCBjbGVhclVudXNlZEVudHJpZXMoKSB7CiAgICAgICAgZmluYWwgamF2
YS51dGlsLkxpc3QgZGVhZFJlY3RzID0gbmV3IEFycmF5TGlzdCAvKjxSZWN0PiovKCk7CgogICAg
ICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY29udGVudHMgb2YgdGhlIGJhY2tpbmcgc3RvcmUs
IHJlbW92aW5nCiAgICAgICAgLy8gdGV4dCBzdHJpbmdzIHRoYXQgaGF2ZW4ndCBiZWVuIHVzZWQg
cmVjZW50bHkKICAgICAgICBwYWNrZXIudmlzaXQobmV3IFJlY3RWaXNpdG9yKCkgewogICAgICAg
ICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoUmVjdCByZWN0KSB7CiAgICAgICAgICAgICAgICAg
ICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwoKICAgICAg
ICAgICAgICAgICAgICBpZiAoZGF0YS51c2VkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAg
ZGF0YS5jbGVhclVzZWQoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAg
ICAgICAgICAgICAgICBkZWFkUmVjdHMuYWRkKHJlY3QpOwogICAgICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIGZvciAoSXRlcmF0b3Ig
aXRlciA9IGRlYWRSZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKICAgICAgICAg
ICAgUmVjdCByID0gKFJlY3QpIGl0ZXIubmV4dCgpOwogICAgICAgICAgICBwYWNrZXIucmVtb3Zl
KHIpOwogICAgICAgICAgICBzdHJpbmdMb2NhdGlvbnMucmVtb3ZlKCgoVGV4dERhdGEpIHIuZ2V0
VXNlckRhdGEoKSkuc3RyaW5nKCkpOwoKICAgICAgICAgICAgaW50IHVuaWNvZGVUb0NsZWFyRnJv
bUNhY2hlID0gKChUZXh0RGF0YSkgci5nZXRVc2VyRGF0YSgpKS51bmljb2RlSUQ7CgogICAgICAg
ICAgICBpZiAodW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUgPiAwKSB7CiAgICAgICAgICAgICAgICBt
R2x5cGhQcm9kdWNlci5jbGVhckNhY2hlRW50cnkodW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUpOwog
ICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAgICAgIGlmIChERUJVRykgewogICAgICAgICAg
ICAvLyAgICAgICAgR3JhcGhpY3MyRCBnID0gZ2V0R3JhcGhpY3MyRCgpOwogICAgICAgICAgICAv
LyAgICAgICAgZy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOwogICAgICAgICAg
ICAvLyAgICAgICAgZy5maWxsUmVjdChyLngoKSwgci55KCksIHIudygpLCByLmgoKSk7CiAgICAg
ICAgICAgIC8vICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0ZS5TcmMpOwogICAg
ICAgICAgICAvLyAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIElmIHdlIHJlbW92ZWQgZGVh
ZCByZWN0YW5nbGVzIHRoaXMgY3ljbGUsIHRyeSB0byBkbyBhIGNvbXBhY3Rpb24KICAgICAgICBm
bG9hdCBmcmFnID0gcGFja2VyLnZlcnRpY2FsRnJhZ21lbnRhdGlvblJhdGlvKCk7CgogICAgICAg
IGlmICghZGVhZFJlY3RzLmlzRW1wdHkoKSAmJiAoZnJhZyA+IE1BWF9WRVJUSUNBTF9GUkFHTUVO
VEFUSU9OKSkgewogICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3Rl
bS5lcnIucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFj
dGluZyBUZXh0UmVuZGVyZXIgYmFja2luZyBzdG9yZSBkdWUgdG8gdmVydGljYWwgZnJhZ21lbnRh
dGlvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnKTsKICAgICAg
ICAgICAgfQoKICAgICAgICAgICAgcGFja2VyLmNvbXBhY3QoKTsKICAgICAgICB9CgogICAgICAg
IGlmIChERUJVRykgewogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5tYXJrRGlydHkoMCwg
MCwgZ2V0QmFja2luZ1N0b3JlKCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmdldEhlaWdodCgpKTsKICAgICAgICB9
CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGludGVybmFsX2RyYXczRChDaGFyU2VxdWVuY2Ugc3Ry
LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmbG9hdCBzY2FsZUZhY3RvcikgewogICAgICAgIExpc3QvKjxHbHlwaD4qLyBnbHlwaHMg
PSBtR2x5cGhQcm9kdWNlci5nZXRHbHlwaHMoc3RyKTsKICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0
ZXIgPSBnbHlwaHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewogICAgICAgICAgICBH
bHlwaCBnbHlwaCA9IChHbHlwaCkgaXRlci5uZXh0KCk7CiAgICAgICAgICAgIGZsb2F0IGFkdmFu
Y2UgPSBnbHlwaC5kcmF3M0QoeCwgeSwgeiwgc2NhbGVGYWN0b3IpOwogICAgICAgICAgICB4ICs9
IGFkdmFuY2UgKiBzY2FsZUZhY3RvcjsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk
IGZsdXNoR2x5cGhQaXBlbGluZSgpIHsKICAgICAgICBpZiAobVBpcGVsaW5lZFF1YWRSZW5kZXJl
ciAhPSBudWxsKSB7CiAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZHJhdygpOwog
ICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgZHJhdzNEX1JPQlVTVChDaGFyU2VxdWVu
Y2Ugc3RyLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAgICAgICBTdHJpbmcgY3VyU3RyOwogICAg
ICAgIGlmIChzdHIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKICAgICAgICAgICAgY3VyU3RyID0gKFN0
cmluZykgc3RyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN1clN0ciA9IHN0ci50b1N0
cmluZygpOwogICAgICAgIH0KCiAgICAgICAgLy8gTG9vayB1cCB0aGUgc3RyaW5nIG9uIHRoZSBi
YWNraW5nIHN0b3JlCiAgICAgICAgUmVjdCByZWN0ID0gKFJlY3QpIHN0cmluZ0xvY2F0aW9ucy5n
ZXQoY3VyU3RyKTsKCiAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBS
YXN0ZXJpemUgdGhpcyBzdHJpbmcgYW5kIHBsYWNlIGl0IG9uIHRoZSBiYWNraW5nIHN0b3JlCiAg
ICAgICAgICAgIEdyYXBoaWNzMkQgZyA9IGdldEdyYXBoaWNzMkQoKTsKICAgICAgICAgICAgUmVj
dGFuZ2xlMkQgb3JpZ0JCb3ggPSBwcmVOb3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRz
KGN1clN0ciwgZm9udCwgZ2V0Rm9udFJlbmRlckNvbnRleHQoKSkpOwogICAgICAgICAgICBSZWN0
YW5nbGUyRCBiYm94ID0gbm9ybWFsaXplKG9yaWdCQm94KTsKICAgICAgICAgICAgUG9pbnQgb3Jp
Z2luID0gbmV3IFBvaW50KChpbnQpIC1iYm94LmdldE1pblgoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChpbnQpIC1iYm94LmdldE1pblkoKSk7CiAgICAgICAgICAgIHJl
Y3QgPSBuZXcgUmVjdCgwLCAwLCAoaW50KSBiYm94LmdldFdpZHRoKCksCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoaW50KSBiYm94LmdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3IFRleHREYXRhKGN1clN0ciwgb3JpZ2luLCBvcmlnQkJveCwgLTEpKTsKCiAg
ICAgICAgICAgIHBhY2tlci5hZGQocmVjdCk7CiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5w
dXQoY3VyU3RyLCByZWN0KTsKCiAgICAgICAgICAgIC8vIFJlLWZldGNoIHRoZSBHcmFwaGljczJE
IGluIGNhc2UgdGhlIGFkZGl0aW9uIG9mIHRoZSByZWN0YW5nbGUKICAgICAgICAgICAgLy8gY2F1
c2VkIHRoZSBvbGQgYmFja2luZyBzdG9yZSB0byBiZSB0aHJvd24gYXdheQogICAgICAgICAgICBn
ID0gZ2V0R3JhcGhpY3MyRCgpOwoKICAgICAgICAgICAgLy8gT0ssIHNob3VsZCBub3cgaGF2ZSBh
biAoeCwgeSkgZm9yIHRoaXMgcmVjdGFuZ2xlOyByYXN0ZXJpemUKICAgICAgICAgICAgLy8gdGhl
IFN0cmluZwogICAgICAgICAgICBpbnQgc3RyeCA9IHJlY3QueCgpICsgb3JpZ2luLng7CiAgICAg
ICAgICAgIGludCBzdHJ5ID0gcmVjdC55KCkgKyBvcmlnaW4ueTsKCiAgICAgICAgICAgIC8vIENs
ZWFyIG91dCB0aGUgYXJlYSB3ZSdyZSBnb2luZyB0byBkcmF3IGludG8KICAgICAgICAgICAgZy5z
ZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOwogICAgICAgICAgICBnLmZpbGxSZWN0
KHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53KCksIHJlY3QuaCgpKTsKICAgICAgICAgICAgZy5z
ZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuU3JjKTsKCiAgICAgICAgICAgIC8vIERyYXcgdGhl
IHN0cmluZwogICAgICAgICAgICByZW5kZXJEZWxlZ2F0ZS5kcmF3KGcsIGN1clN0ciwgc3RyeCwg
c3RyeSk7CgogICAgICAgICAgICBpZiAoRFJBV19CQk9YRVMpIHsKICAgICAgICAgICAgICAgIFRl
eHREYXRhIGRhdGEgPSAoVGV4dERhdGEpIHJlY3QuZ2V0VXNlckRhdGEoKTsKICAgICAgICAgICAg
ICAgIC8vIERyYXcgYSBib3VuZGluZyBib3ggb24gdGhlIGJhY2tpbmcgc3RvcmUKICAgICAgICAg
ICAgICAgIGcuZHJhd1JlY3Qoc3RyeCAtIGRhdGEub3JpZ09yaWdpblgoKSwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3RyeSAtIGRhdGEub3JpZ09yaWdpblkoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGludCkgZGF0YS5vcmlnUmVjdCgpLmdldFdpZHRoKCksCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChpbnQpIGRhdGEub3JpZ1JlY3QoKS5nZXRIZWlnaHQoKSk7CiAgICAg
ICAgICAgICAgICBnLmRyYXdSZWN0KHN0cnggLSBkYXRhLm9yaWdpbigpLngsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0cnkgLSBkYXRhLm9yaWdpbigpLnksCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlY3QudygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmgoKSk7
CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1hcmsgdGhpcyByZWdpb24gb2YgdGhlIFRl
eHR1cmVSZW5kZXJlciBhcyBkaXJ0eQogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5tYXJr
RGlydHkocmVjdC54KCksIHJlY3QueSgpLCByZWN0LncoKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICB9CgogICAgICAgIC8vIE9LLCBu
b3cgZHJhdyB0aGUgcG9ydGlvbiBvZiB0aGUgYmFja2luZyBzdG9yZSB0byB0aGUgc2NyZWVuCiAg
ICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CgogICAg
ICAgIC8vIE5PVEUgdGhhdCB0aGUgcmVjdGFuZ2xlcyBtYW5hZ2VkIGJ5IHRoZSBwYWNrZXIgaGF2
ZSB0aGVpcgogICAgICAgIC8vIG9yaWdpbiBhdCB0aGUgdXBwZXItbGVmdCBidXQgdGhlIFRleHR1
cmVSZW5kZXJlcidzIG9yaWdpbiBpcwogICAgICAgIC8vIGF0IGl0cyBsb3dlciBsZWZ0ISEhCiAg
ICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwogICAg
ICAgIGRhdGEubWFya1VzZWQoKTsKCiAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QgPSBkYXRh
Lm9yaWdSZWN0KCk7CiAgICAgICAgCiAgICAgICAgLy8gQWxpZ24gdGhlIGxlZnRtb3N0IHBvaW50
IG9mIHRoZSBiYXNlbGluZSB0byB0aGUgKHgsIHksIHopIGNvb3JkaW5hdGUgcmVxdWVzdGVkCiAg
ICAgICAgcmVuZGVyZXIuZHJhdzNEUmVjdCh4IC0gKHNjYWxlRmFjdG9yICogZGF0YS5vcmlnT3Jp
Z2luWCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLSAoc2NhbGVGYWN0b3IgKiAo
KGZsb2F0KSBvcmlnUmVjdC5nZXRIZWlnaHQoKSAtIGRhdGEub3JpZ09yaWdpblkoKSkpLCB6LAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC54KCkgKyAoZGF0YS5vcmlnaW4oKS54IC0g
ZGF0YS5vcmlnT3JpZ2luWCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVy
LmdldEhlaWdodCgpIC0gcmVjdC55KCkgLSAoaW50KSBvcmlnUmVjdC5nZXRIZWlnaHQoKSAtCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhLm9yaWdpbigpLnkgLSBkYXRhLm9yaWdP
cmlnaW5ZKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgb3JpZ1JlY3QuZ2V0
V2lkdGgoKSwgKGludCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCksIHNjYWxlRmFjdG9yKTsKICAgIH0K
CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIERlYnVnZ2luZyBmdW5jdGlvbmFsaXR5CiAgICAv
LwogICAgcHJpdmF0ZSB2b2lkIGRlYnVnKCkgewogICAgICAgIGRiZ0ZyYW1lID0gbmV3IEZyYW1l
KCJUZXh0UmVuZGVyZXIgRGVidWcgT3V0cHV0Iik7CgogICAgICAgIEdMQ2FudmFzIGRiZ0NhbnZh
cyA9IG5ldyBHTENhbnZhcyhuZXcgR0xDYXBhYmlsaXRpZXMoKSwgbnVsbCwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xDb250ZXh0LmdldEN1cnJlbnQoKSwgbnVs
bCk7CiAgICAgICAgZGJnQ2FudmFzLmFkZEdMRXZlbnRMaXN0ZW5lcihuZXcgRGVidWdMaXN0ZW5l
cihkYmdGcmFtZSkpOwogICAgICAgIGRiZ0ZyYW1lLmFkZChkYmdDYW52YXMpOwoKICAgICAgICBm
aW5hbCBGUFNBbmltYXRvciBhbmltID0gbmV3IEZQU0FuaW1hdG9yKGRiZ0NhbnZhcywgMTApOwog
ICAgICAgIGRiZ0ZyYW1lLmFkZFdpbmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkgewog
ICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7
CiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHRoaXMgb24gYW5vdGhlciB0aHJlYWQgdGhhbiB0
aGUgQVdUIGV2ZW50IHF1ZXVlIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRo
ZSBjYWxsIHRvIEFuaW1hdG9yLnN0b3AoKSBjb21wbGV0ZXMgYmVmb3JlCiAgICAgICAgICAgICAg
ICAgICAgLy8gZXhpdGluZwogICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5h
YmxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RvcCgpOwogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KS5zdGFydCgpOwogICAg
ICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICBkYmdGcmFtZS5zZXRTaXplKGtT
aXplLCBrU2l6ZSk7CiAgICAgICAgZGJnRnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKICAgICAgICBh
bmltLnN0YXJ0KCk7CiAgICAgICAgZGVidWdnZWQgPSB0cnVlOwogICAgfQoKICAgIC8qKiBDbGFz
cyBzdXBwb3J0aW5nIG1vcmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIHByb2Nlc3Mgb2YgcmVuZGVy
aW5nCiAgICAgICAgdGhlIGJpdG1hcHBlZCB0ZXh0LiBBbGxvd3MgY3VzdG9taXphdGlvbiBvZiB3
aGV0aGVyIHRoZSBiYWNraW5nCiAgICAgICAgc3RvcmUgdGV4dCBiaXRtYXAgaXMgZnVsbC1jb2xv
ciBvciBpbnRlbnNpdHkgb25seSwgdGhlIHNpemUgb2YKICAgICAgICBlYWNoIGluZGl2aWR1YWwg
cmVuZGVyZWQgdGV4dCByZWN0YW5nbGUsIGFuZCB0aGUgY29udGVudHMgb2YKICAgICAgICBlYWNo
IGluZGl2aWR1YWwgcmVuZGVyZWQgdGV4dCBzdHJpbmcuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0
aW9uCiAgICAgICAgb2YgdGhpcyBpbnRlcmZhY2UgdXNlcyBhbiBpbnRlbnNpdHktb25seSB0ZXh0
dXJlLCBhCiAgICAgICAgY2xvc2VseS1jcm9wcGVkIHJlY3RhbmdsZSBhcm91bmQgdGhlIHRleHQs
IGFuZCByZW5kZXJzIHRleHQKICAgICAgICB1c2luZyB0aGUgY29sb3Igd2hpdGUsIHdoaWNoIGlz
IG1vZHVsYXRlZCBieSB0aGUgc2V0IGNvbG9yCiAgICAgICAgZHVyaW5nIHRoZSByZW5kZXJpbmcg
cHJvY2Vzcy4gKi8KICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlbmRlckRlbGVnYXRlIHsK
ICAgICAgICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJhY2tpbmcgc3RvcmUgb2YgdGhpcyBU
ZXh0UmVuZGVyZXIKICAgICAgICAgICAgc2hvdWxkIGJlIGludGVuc2l0eS1vbmx5ICh0aGUgZGVm
YXVsdCkgb3IgZnVsbC1jb2xvci4gKi8KICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlbnNpdHlP
bmx5KCk7CgogICAgICAgIC8qKiBDb21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBTdHJp
bmcgcmVsYXRpdmUgdG8gdGhlCiAgICAgICAgICAgIG9yaWdpbi4gKi8KICAgICAgICBwdWJsaWMg
UmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKFN0cmluZyBzdHIsIEZvbnQgZm9udCwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7CgogICAgICAg
IC8qKiBDb21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc2VxdWVuY2Ug
cmVsYXRpdmUKICAgICAgICAgICAgdG8gdGhlIG9yaWdpbi4gKi8KICAgICAgICBwdWJsaWMgUmVj
dGFuZ2xlMkQgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7CgogICAg
ICAgIC8qKiBDb21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBHbHlwaFZlY3RvciwgYWxy
ZWFkeQogICAgICAgICAgICBhc3N1bWVkIHRvIGhhdmUgYmVlbiBjcmVhdGVkIGZvciBhIHBhcnRp
Y3VsYXIgRm9udCwKICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbi4gKi8KICAgICAg
ICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKEdseXBoVmVjdG9yIGd2LCBGb250UmVuZGVy
Q29udGV4dCBmcmMpOwoKICAgICAgICAvKiogUmVuZGVyIHRoZSBwYXNzZWQgY2hhcmFjdGVyIHNl
cXVlbmNlIGF0IHRoZSBkZXNpZ25hdGVkCiAgICAgICAgICAgIGxvY2F0aW9uIHVzaW5nIHRoZSBz
dXBwbGllZCBHcmFwaGljczJEIGluc3RhbmNlLiBUaGUKICAgICAgICAgICAgc3Vycm91bmRpbmcg
cmVnaW9uIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gY2xlYXJlZCB0byB0aGUgUkdCCiAgICAgICAg
ICAgIGNvbG9yICgwLCAwLCAwKSB3aXRoIHplcm8gYWxwaGEuIFRoZSBpbml0aWFsIGRyYXdpbmcg
Y29udGV4dAogICAgICAgICAgICBvZiB0aGUgcGFzc2VkIEdyYXBoaWNzMkQgd2lsbCBiZSBzZXQg
dG8gdXNlCiAgICAgICAgICAgIEFscGhhQ29tcG9zaXRlLlNyYywgdGhlIGNvbG9yIHdoaXRlLCB0
aGUgRm9udCBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgIFRleHRSZW5kZXJlcidzIGNvbnN0
cnVjdG9yLCBhbmQgdGhlIHJlbmRlcmluZyBoaW50cyBzcGVjaWZpZWQKICAgICAgICAgICAgaW4g
dGhlIFRleHRSZW5kZXJlciBjb25zdHJ1Y3Rvci4gIENoYW5nZXMgbWFkZSBieSB0aGUgZW5kIHVz
ZXIKICAgICAgICAgICAgbWF5IGJlIHZpc2libGUgaW4gc3VjY2Vzc2l2ZSBjYWxscyB0byB0aGlz
IG1ldGhvZCwgYnV0IGFyZSBub3QKICAgICAgICAgICAgZ3VhcmFudGVlZCB0byBiZSBwcmVzZXJ2
ZWQuICBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2QKICAgICAgICAgICAgc2hvdWxkIHJlc2V0
IHRoZSBHcmFwaGljczJEJ3Mgc3RhdGUgdG8gdGhhdCBkZXNpcmVkIGVhY2ggdGltZQogICAgICAg
ICAgICB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGluIHBhcnRpY3VsYXIgdGhvc2Ugc3RhdGVzIHdo
aWNoIGFyZQogICAgICAgICAgICBub3QgdGhlIGRlZmF1bHRzLiAqLwogICAgICAgIHB1YmxpYyB2
b2lkIGRyYXcoR3JhcGhpY3MyRCBncmFwaGljcywgU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KTsK
CiAgICAgICAgLyoqIFJlbmRlciB0aGUgcGFzc2VkIEdseXBoVmVjdG9yIGF0IHRoZSBkZXNpZ25h
dGVkIGxvY2F0aW9uIHVzaW5nCiAgICAgICAgICAgIHRoZSBzdXBwbGllZCBHcmFwaGljczJEIGlu
c3RhbmNlLiBUaGUgc3Vycm91bmRpbmcgcmVnaW9uIHdpbGwKICAgICAgICAgICAgYWxyZWFkeSBo
YXZlIGJlZW4gY2xlYXJlZCB0byB0aGUgUkdCIGNvbG9yICgwLCAwLCAwKSB3aXRoIHplcm8KICAg
ICAgICAgICAgYWxwaGEuIFRoZSBpbml0aWFsIGRyYXdpbmcgY29udGV4dCBvZiB0aGUgcGFzc2Vk
IEdyYXBoaWNzMkQKICAgICAgICAgICAgd2lsbCBiZSBzZXQgdG8gdXNlIEFscGhhQ29tcG9zaXRl
LlNyYywgdGhlIGNvbG9yIHdoaXRlLCB0aGUKICAgICAgICAgICAgRm9udCBzcGVjaWZpZWQgaW4g
dGhlIFRleHRSZW5kZXJlcidzIGNvbnN0cnVjdG9yLCBhbmQgdGhlCiAgICAgICAgICAgIHJlbmRl
cmluZyBoaW50cyBzcGVjaWZpZWQgaW4gdGhlIFRleHRSZW5kZXJlciBjb25zdHJ1Y3Rvci4KICAg
ICAgICAgICAgQ2hhbmdlcyBtYWRlIGJ5IHRoZSBlbmQgdXNlciBtYXkgYmUgdmlzaWJsZSBpbiBz
dWNjZXNzaXZlCiAgICAgICAgICAgIGNhbGxzIHRvIHRoaXMgbWV0aG9kLCBidXQgYXJlIG5vdCBn
dWFyYW50ZWVkIHRvIGJlIHByZXNlcnZlZC4KICAgICAgICAgICAgSW1wbGVtZW50b3JzIG9mIHRo
aXMgbWV0aG9kIHNob3VsZCByZXNldCB0aGUgR3JhcGhpY3MyRCdzCiAgICAgICAgICAgIHN0YXRl
IHRvIHRoYXQgZGVzaXJlZCBlYWNoIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpbgogICAg
ICAgICAgICBwYXJ0aWN1bGFyIHRob3NlIHN0YXRlcyB3aGljaCBhcmUgbm90IHRoZSBkZWZhdWx0
cy4gKi8KICAgICAgICBwdWJsaWMgdm9pZCBkcmF3R2x5cGhWZWN0b3IoR3JhcGhpY3MyRCBncmFw
aGljcywgR2x5cGhWZWN0b3Igc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpbnQgeCwgaW50IHkpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYXJTZXF1
ZW5jZUl0ZXJhdG9yIGltcGxlbWVudHMgQ2hhcmFjdGVySXRlcmF0b3IgewogICAgICAgIENoYXJT
ZXF1ZW5jZSBtU2VxdWVuY2U7CiAgICAgICAgaW50IG1MZW5ndGg7CiAgICAgICAgaW50IG1DdXJy
ZW50SW5kZXg7CgogICAgICAgIENoYXJTZXF1ZW5jZUl0ZXJhdG9yKCkgewogICAgICAgIH0KCiAg
ICAgICAgQ2hhclNlcXVlbmNlSXRlcmF0b3IoQ2hhclNlcXVlbmNlIHNlcXVlbmNlKSB7CiAgICAg
ICAgICAgIGluaXRGcm9tQ2hhclNlcXVlbmNlKHNlcXVlbmNlKTsKICAgICAgICB9CgogICAgICAg
IHB1YmxpYyB2b2lkIGluaXRGcm9tQ2hhclNlcXVlbmNlKENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSkg
ewogICAgICAgICAgICBtU2VxdWVuY2UgPSBzZXF1ZW5jZTsKICAgICAgICAgICAgbUxlbmd0aCA9
IG1TZXF1ZW5jZS5sZW5ndGgoKTsKICAgICAgICAgICAgbUN1cnJlbnRJbmRleCA9IDA7CiAgICAg
ICAgfQoKICAgICAgICBwdWJsaWMgY2hhciBsYXN0KCkgewogICAgICAgICAgICBtQ3VycmVudElu
ZGV4ID0gTWF0aC5tYXgoMCwgbUxlbmd0aCAtIDEpOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJl
bnQoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFyIGN1cnJlbnQoKSB7CiAgICAgICAg
ICAgIGlmICgobUxlbmd0aCA9PSAwKSB8fCAobUN1cnJlbnRJbmRleCA+PSBtTGVuZ3RoKSkgewog
ICAgICAgICAgICAgICAgcmV0dXJuIENoYXJhY3Rlckl0ZXJhdG9yLkRPTkU7CiAgICAgICAgICAg
IH0KCiAgICAgICAgICAgIHJldHVybiBtU2VxdWVuY2UuY2hhckF0KG1DdXJyZW50SW5kZXgpOwog
ICAgICAgIH0KCiAgICAgICAgcHVibGljIGNoYXIgbmV4dCgpIHsKICAgICAgICAgICAgbUN1cnJl
bnRJbmRleCsrOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQoKTsKICAgICAgICB9CgogICAg
ICAgIHB1YmxpYyBjaGFyIHByZXZpb3VzKCkgewogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0g
TWF0aC5tYXgobUN1cnJlbnRJbmRleCAtIDEsIDApOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJl
bnQoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFyIHNldEluZGV4KGludCBwb3NpdGlv
bikgewogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0gcG9zaXRpb247CgogICAgICAgICAgICBy
ZXR1cm4gY3VycmVudCgpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBnZXRCZWdpbklu
ZGV4KCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBp
bnQgZ2V0RW5kSW5kZXgoKSB7CiAgICAgICAgICAgIHJldHVybiBtTGVuZ3RoOwogICAgICAgIH0K
CiAgICAgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKICAgICAgICAgICAgcmV0dXJuIG1DdXJy
ZW50SW5kZXg7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAg
ICAgICAgICBDaGFyU2VxdWVuY2VJdGVyYXRvciBpdGVyID0gbmV3IENoYXJTZXF1ZW5jZUl0ZXJh
dG9yKG1TZXF1ZW5jZSk7CiAgICAgICAgICAgIGl0ZXIubUN1cnJlbnRJbmRleCA9IG1DdXJyZW50
SW5kZXg7CgogICAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9CgogICAgICAgIHB1Ymxp
YyBjaGFyIGZpcnN0KCkgewogICAgICAgICAgICBpZiAobUxlbmd0aCA9PSAwKSB7CiAgICAgICAg
ICAgICAgICByZXR1cm4gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORTsKICAgICAgICAgICAgfQoKICAg
ICAgICAgICAgbUN1cnJlbnRJbmRleCA9IDA7CgogICAgICAgICAgICByZXR1cm4gY3VycmVudCgp
OwogICAgICAgIH0KICAgIH0KCiAgICAvLyBEYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHJlY3Rh
bmdsZSBvZiB0ZXh0CiAgICBzdGF0aWMgY2xhc3MgVGV4dERhdGEgewogICAgICAgIC8vIEJhY2st
cG9pbnRlciB0byBTdHJpbmcgdGhpcyBUZXh0RGF0YSBkZXNjcmliZXMsIGlmIGl0CiAgICAgICAg
Ly8gcmVwcmVzZW50cyBhIFN0cmluZyByYXRoZXIgdGhhbiBhIHNpbmdsZSBnbHlwaAogICAgICAg
IHByaXZhdGUgU3RyaW5nIHN0cjsKCiAgICAgICAgLy8gSWYgdGhpcyBUZXh0RGF0YSByZXByZXNl
bnRzIGEgc2luZ2xlIGdseXBoLCB0aGlzIGlzIGl0cwogICAgICAgIC8vIHVuaWNvZGUgSUQKICAg
ICAgICBpbnQgdW5pY29kZUlEOwoKICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG11c3QgYmUgZGVm
aW5lZCBhbmQgdXNlZCBWRVJZIHByZWNpc2VseS4gVGhpcyBpcwogICAgICAgIC8vIHRoZSBvZmZz
ZXQgZnJvbSB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhpcyByZWN0YW5nbGUgKEphdmEKICAg
ICAgICAvLyAyRCBjb29yZGluYXRlIHN5c3RlbSkgYXQgd2hpY2ggdGhlIHN0cmluZyBtdXN0IGJl
IHJhc3Rlcml6ZWQgaW4KICAgICAgICAvLyBvcmRlciB0byBmaXQgd2l0aGluIHRoZSByZWN0YW5n
bGUgLS0gdGhlIGxlZnRtb3N0IHBvaW50IG9mIHRoZQogICAgICAgIC8vIGJhc2VsaW5lLgogICAg
ICAgIHByaXZhdGUgUG9pbnQgb3JpZ2luOwoKICAgICAgICAvLyBUaGlzIHJlcHJlc2VudHMgdGhl
IHByZS1ub3JtYWxpemVkIHJlY3RhbmdsZSwgd2hpY2ggZml0cwogICAgICAgIC8vIHdpdGhpbiB0
aGUgcmVjdGFuZ2xlIG9uIHRoZSBiYWNraW5nIHN0b3JlLiBXZSBrZWVwIGEKICAgICAgICAvLyBv
bmUtcGl4ZWwgYm9yZGVyIGFyb3VuZCBlbnRyaWVzIG9uIHRoZSBiYWNraW5nIHN0b3JlIHRvCiAg
ICAgICAgLy8gcHJldmVudCBibGVlZGluZyBvZiBhZGphY2VudCBsZXR0ZXJzIHdoZW4gdXNpbmcg
R0xfTElORUFSCiAgICAgICAgLy8gZmlsdGVyaW5nIGZvciByZW5kZXJpbmcuIFRoZSBvcmlnaW4g
b2YgdGhpcyByZWN0YW5nbGUgaXMKICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW4g
YWJvdmUuCiAgICAgICAgcHJpdmF0ZSBSZWN0YW5nbGUyRCBvcmlnUmVjdDsKCiAgICAgICAgcHJp
dmF0ZSBib29sZWFuIHVzZWQ7IC8vIFdoZXRoZXIgdGhpcyB0ZXh0IHdhcyB1c2VkIHJlY2VudGx5
CgogICAgICAgIFRleHREYXRhKFN0cmluZyBzdHIsIFBvaW50IG9yaWdpbiwgUmVjdGFuZ2xlMkQg
b3JpZ1JlY3QsIGludCB1bmljb2RlSUQpIHsKICAgICAgICAgICAgdGhpcy5zdHIgPSBzdHI7CiAg
ICAgICAgICAgIHRoaXMub3JpZ2luID0gb3JpZ2luOwogICAgICAgICAgICB0aGlzLm9yaWdSZWN0
ID0gb3JpZ1JlY3Q7CiAgICAgICAgICAgIHRoaXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAg
ICAgIH0KCiAgICAgICAgU3RyaW5nIHN0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cjsK
ICAgICAgICB9CgogICAgICAgIFBvaW50IG9yaWdpbigpIHsKICAgICAgICAgICAgcmV0dXJuIG9y
aWdpbjsKICAgICAgICB9CgogICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcyBh
cmUgdXNlZCB0byBsb2NhdGUgdGhlIGdseXBoCiAgICAgICAgLy8gd2l0aGluIHRoZSBleHBhbmRl
ZCByZWN0YW5nbGUgY29taW5nIGZyb20gbm9ybWFsaXplKCkKICAgICAgICBpbnQgb3JpZ09yaWdp
blgoKSB7CiAgICAgICAgICAgIHJldHVybiAoaW50KSAtb3JpZ1JlY3QuZ2V0TWluWCgpOwogICAg
ICAgIH0KCiAgICAgICAgaW50IG9yaWdPcmlnaW5ZKCkgewogICAgICAgICAgICByZXR1cm4gKGlu
dCkgLW9yaWdSZWN0LmdldE1pblkoKTsKICAgICAgICB9CgogICAgICAgIFJlY3RhbmdsZTJEIG9y
aWdSZWN0KCkgewogICAgICAgICAgICByZXR1cm4gb3JpZ1JlY3Q7CiAgICAgICAgfQoKICAgICAg
ICBib29sZWFuIHVzZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB1c2VkOwogICAgICAgIH0KCiAg
ICAgICAgdm9pZCBtYXJrVXNlZCgpIHsKICAgICAgICAgICAgdXNlZCA9IHRydWU7CiAgICAgICAg
fQoKICAgICAgICB2b2lkIGNsZWFyVXNlZCgpIHsKICAgICAgICAgICAgdXNlZCA9IGZhbHNlOwog
ICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBNYW5hZ2VyIGltcGxlbWVudHMgQmFja2luZ1N0b3Jl
TWFuYWdlciB7CiAgICAgICAgcHJpdmF0ZSBHcmFwaGljczJEIGc7CgogICAgICAgIHB1YmxpYyBP
YmplY3QgYWxsb2NhdGVCYWNraW5nU3RvcmUoaW50IHcsIGludCBoKSB7CiAgICAgICAgICAgIC8v
IEZJWE1FOiBzaG91bGQgY29uc2lkZXIgY2hlY2tpbmcgRm9udCdzIGF0dHJpYnV0ZXMgdG8gc2Vl
CiAgICAgICAgICAgIC8vIHdoZXRoZXIgd2UncmUgbGlrZWx5IHRvIG5lZWQgdG8gc3VwcG9ydCBh
IGZ1bGwgUkdCQSBiYWNraW5nCiAgICAgICAgICAgIC8vIHN0b3JlIChpLmUuLCBub24tZGVmYXVs
dCBQYWludCwgZm9yZWdyb3VuZCBjb2xvciwgZXRjLiksIGJ1dAogICAgICAgICAgICAvLyBmb3Ig
bm93LCBsZXQncyBqdXN0IGJlIG1vcmUgZWZmaWNpZW50CiAgICAgICAgICAgIFRleHR1cmVSZW5k
ZXJlciByZW5kZXJlcjsKCiAgICAgICAgICAgIGlmIChyZW5kZXJEZWxlZ2F0ZS5pbnRlbnNpdHlP
bmx5KCkpIHsKICAgICAgICAgICAgICAgIHJlbmRlcmVyID0gVGV4dHVyZVJlbmRlcmVyLmNyZWF0
ZUFscGhhT25seVJlbmRlcmVyKHcsIGgsIG1pcG1hcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAg
ICAgICAgICAgICAgICByZW5kZXJlciA9IG5ldyBUZXh0dXJlUmVuZGVyZXIodywgaCwgdHJ1ZSwg
bWlwbWFwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZW5kZXJlci5zZXRTbW9vdGhpbmco
c21vb3RoaW5nKTsKCiAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgU3lz
dGVtLmVyci5wcmludGxuKCIgVGV4dFJlbmRlcmVyIGFsbG9jYXRpbmcgYmFja2luZyBzdG9yZSAi
ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICsgIiB4ICIgKyBoKTsKICAg
ICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwogICAgICAgIH0KCiAgICAg
ICAgcHVibGljIHZvaWQgZGVsZXRlQmFja2luZ1N0b3JlKE9iamVjdCBiYWNraW5nU3RvcmUpIHsK
ICAgICAgICAgICAgKChUZXh0dXJlUmVuZGVyZXIpIGJhY2tpbmdTdG9yZSkuZGlzcG9zZSgpOwog
ICAgICAgIH0KCiAgICAgICAgcHVibGljIGJvb2xlYW4gcHJlRXhwYW5kKFJlY3QgY2F1c2UsIGlu
dCBhdHRlbXB0TnVtYmVyKSB7CiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRoaXMgb25lIHRpbWU7
IGNsZWFyIG91dCBwb3RlbnRpYWxseSBvYnNvbGV0ZSBlbnRyaWVzCiAgICAgICAgICAgIC8vIE5P
VEU6IHRoaXMgaGV1cmlzdGljIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGNsZWFycyB0aGUgdXNlZCBi
aXQKICAgICAgICAgICAgLy8gb2YgYWxsIGVudHJpZXMgc2VlbXMgdG8gY2F1c2UgY3ljbGluZyBv
ZiBlbnRyaWVzIGluIHNvbWUKICAgICAgICAgICAgLy8gc2l0dWF0aW9ucywgd2hlcmUgdGhlIGJh
Y2tpbmcgc3RvcmUgYmVjb21lcyBzbWFsbCBjb21wYXJlZCB0bwogICAgICAgICAgICAvLyB0aGUg
YW1vdW50IG9mIHRleHQgb24gdGhlIHNjcmVlbiAoc2VlIHRoZSBUZXh0RmxvdyBkZW1vKSBhbmQK
ICAgICAgICAgICAgLy8gdGhlIGVudHJpZXMgY29udGludWFsbHkgY3ljbGUgaW4gYW5kIG91dCBv
ZiB0aGUgYmFja2luZwogICAgICAgICAgICAvLyBzdG9yZSwgZGVjcmVhc2luZyBwZXJmb3JtYW5j
ZS4gSWYgd2UgYWRkZWQgYSBsaXR0bGUgYWdlCiAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIHRv
IHRoZSBlbnRyaWVzLCBhbmQgb25seSBjbGVhcmVkIG91dCBlbnRyaWVzCiAgICAgICAgICAgIC8v
IGFib3ZlIGEgY2VydGFpbiBhZ2UsIHRoaXMgYmVoYXZpb3Igd291bGQgYmUgZWxpbWluYXRlZC4K
ICAgICAgICAgICAgLy8gSG93ZXZlciwgaXQgc2VlbXMgdGhlIHN5c3RlbSB1c3VhbGx5IHN0YWJp
bGl6ZXMgaXRzZWxmLCBzbwogICAgICAgICAgICAvLyBmb3Igbm93IHdlJ2xsIGp1c3Qga2VlcCB0
aGluZ3Mgc2ltcGxlLiBOb3RlIHRoYXQgaWYgd2UgZG9uJ3QKICAgICAgICAgICAgLy8gY2xlYXIg
dGhlIHVzZWQgYml0IGhlcmUsIHRoZSBiYWNraW5nIHN0b3JlIHRlbmRzIHRvIGluY3JlYXNlCiAg
ICAgICAgICAgIC8vIHZlcnkgcXVpY2tseSB0byBpdHMgbWF4aW11bSBzaXplLCBhdCBsZWFzdCB3
aXRoIHRoZSBUZXh0RmxvdwogICAgICAgICAgICAvLyBkZW1vIHdoZW4gdGhlIHRleHQgaXMgYmVp
bmcgY29udGludWFsbHkgcmUtbGFpZCBvdXQuCiAgICAgICAgICAgIGlmIChhdHRlbXB0TnVtYmVy
ID09IDApIHsKICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAg
IFN5c3RlbS5lcnIucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgIkNsZWFyaW5nIHVu
dXNlZCBlbnRyaWVzIGluIHByZUV4cGFuZCgpOiBhdHRlbXB0IG51bWJlciAiICsKICAgICAgICAg
ICAgICAgICAgICAgICAgYXR0ZW1wdE51bWJlcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAg
ICAgICAgICAgaWYgKGluQmVnaW5FbmRQYWlyKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRHJh
dyBhbnkgb3V0c3RhbmRpbmcgZ2x5cGhzCiAgICAgICAgICAgICAgICAgICAgZmx1c2goKTsKICAg
ICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGVhclVudXNlZEVudHJpZXMoKTsKCiAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgYWRkaXRpb25GYWlsZWQo
UmVjdCBjYXVzZSwgaW50IGF0dGVtcHROdW1iZXIpIHsKICAgICAgICAgICAgLy8gSGVhdnkgaGFt
bWVyIC0tIG1pZ2h0IGNvbnNpZGVyIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnQKICAgICAgICAg
ICAgcGFja2VyLmNsZWFyKCk7CiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5jbGVhcigpOwog
ICAgICAgICAgICBtR2x5cGhQcm9kdWNlci5jbGVhckFsbENhY2hlRW50cmllcygpOwoKICAgICAg
ICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAqKiogQ2xlYXJlZCBhbGwgdGV4dCBi
ZWNhdXNlIGFkZGl0aW9uIGZhaWxlZCAqKioiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAg
ICAgICAgcHVibGljIHZvaWQgYmVnaW5Nb3ZlbWVudChPYmplY3Qgb2xkQmFja2luZ1N0b3JlLCBP
YmplY3QgbmV3QmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgIC8vIEV4aXQgdGhlIGJlZ2luIC8g
ZW5kIHBhaXIgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewog
ICAgICAgICAgICAgICAgLy8gRHJhdyBhbnkgb3V0c3RhbmRpbmcgZ2x5cGhzCiAgICAgICAgICAg
ICAgICBmbHVzaCgpOwoKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgp
OwoKICAgICAgICAgICAgICAgIC8vIFBvcCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUg
cGlwZWxpbmVkIHF1YWQgcmVuZGVyZXIKICAgICAgICAgICAgICAgIGdsLmdsUG9wQ2xpZW50QXR0
cmliKCk7CgogICAgICAgICAgICAgICAgLy8gVGhlIE9wZW5HTCBzcGVjIGlzIHVuY2xlYXIgYWJv
dXQgd2hldGhlciB0aGlzIGNoYW5nZXMgdGhlCiAgICAgICAgICAgICAgICAvLyBidWZmZXIgYmlu
ZGluZ3MsIHNvIHByZWVtcHRpdmVseSB6ZXJvIG91dCB0aGUgR0xfQVJSQVlfQlVGRkVSCiAgICAg
ICAgICAgICAgICAvLyBiaW5kaW5nCiAgICAgICAgICAgICAgICBpZiAoaXNWQk9BdmFpbGFibGUo
Z2wpKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAg
Z2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7CiAgICAgICAgICAgICAgICAg
ICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRl
bnNpb25BdmFpbGFibGVfVkJPID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpc09ydGhvTW9kZSkgewogICAgICAgICAg
ICAgICAgICAgICgoVGV4dHVyZVJlbmRlcmVyKSBvbGRCYWNraW5nU3RvcmUpLmVuZE9ydGhvUmVu
ZGVyaW5nKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICgo
VGV4dHVyZVJlbmRlcmVyKSBvbGRCYWNraW5nU3RvcmUpLmVuZDNEUmVuZGVyaW5nKCk7CiAgICAg
ICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBu
ZXdSZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZTsKICAgICAgICAg
ICAgZyA9IG5ld1JlbmRlcmVyLmNyZWF0ZUdyYXBoaWNzKCk7CiAgICAgICAgfQoKICAgICAgICBw
dWJsaWMgdm9pZCBtb3ZlKE9iamVjdCBvbGRCYWNraW5nU3RvcmUsIFJlY3Qgb2xkTG9jYXRpb24s
CiAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbmV3QmFja2luZ1N0b3JlLCBSZWN0IG5l
d0xvY2F0aW9uKSB7CiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBvbGRSZW5kZXJlciA9IChU
ZXh0dXJlUmVuZGVyZXIpIG9sZEJhY2tpbmdTdG9yZTsKICAgICAgICAgICAgVGV4dHVyZVJlbmRl
cmVyIG5ld1JlbmRlcmVyID0gKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlOwoKICAg
ICAgICAgICAgaWYgKG9sZFJlbmRlcmVyID09IG5ld1JlbmRlcmVyKSB7CiAgICAgICAgICAgICAg
ICAvLyBNb3ZlbWVudCBvbiB0aGUgc2FtZSBiYWNraW5nIHN0b3JlIC0tIGVhc3kgY2FzZQogICAg
ICAgICAgICAgICAgZy5jb3B5QXJlYShvbGRMb2NhdGlvbi54KCksIG9sZExvY2F0aW9uLnkoKSwg
b2xkTG9jYXRpb24udygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2NhdGlvbi5o
KCksIG5ld0xvY2F0aW9uLngoKSAtIG9sZExvY2F0aW9uLngoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3TG9jYXRpb24ueSgpIC0gb2xkTG9jYXRpb24ueSgpKTsKICAgICAgICAgICAg
fSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gZHJhdyBmcm9tIHRoZSBvbGQgcmVu
ZGVyZXIncyBpbWFnZSBpbnRvIHRoZSBuZXcgb25lCiAgICAgICAgICAgICAgICBJbWFnZSBpbWcg
PSBvbGRSZW5kZXJlci5nZXRJbWFnZSgpOwogICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1n
LCBuZXdMb2NhdGlvbi54KCksIG5ld0xvY2F0aW9uLnkoKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG5ld0xvY2F0aW9uLngoKSArIG5ld0xvY2F0aW9uLncoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG5ld0xvY2F0aW9uLnkoKSArIG5ld0xvY2F0aW9uLmgoKSwgb2xkTG9jYXRp
b24ueCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9jYXRpb24ueSgpLCBvbGRM
b2NhdGlvbi54KCkgKyBvbGRMb2NhdGlvbi53KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBvbGRMb2NhdGlvbi55KCkgKyBvbGRMb2NhdGlvbi5oKCksIG51bGwpOwogICAgICAgICAgICB9
CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBlbmRNb3ZlbWVudChPYmplY3Qgb2xkQmFj
a2luZ1N0b3JlLCBPYmplY3QgbmV3QmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgIGcuZGlzcG9z
ZSgpOwoKICAgICAgICAgICAgLy8gU3luYyB0aGUgd2hvbGUgc3VyZmFjZQogICAgICAgICAgICBU
ZXh0dXJlUmVuZGVyZXIgbmV3UmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBuZXdCYWNraW5n
U3RvcmU7CiAgICAgICAgICAgIG5ld1JlbmRlcmVyLm1hcmtEaXJ0eSgwLCAwLCBuZXdSZW5kZXJl
ci5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVuZGVy
ZXIuZ2V0SGVpZ2h0KCkpOwoKICAgICAgICAgICAgLy8gUmUtZW50ZXIgdGhlIGJlZ2luIC8gZW5k
IHBhaXIgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewogICAg
ICAgICAgICAgICAgaWYgKGlzT3J0aG9Nb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgKChUZXh0
dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZSkuYmVnaW5PcnRob1JlbmRlcmluZyhiZWdpblJl
bmRlcmluZ1dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQsIGJl
Z2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsK
ICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5i
ZWdpbjNEUmVuZGVyaW5nKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8g
UHVzaCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUgcGlwZWxpbmVkIHF1YWQgcmVuZGVy
ZXIKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwogICAgICAgICAg
ICAgICAgZ2wuZ2xQdXNoQ2xpZW50QXR0cmliKChpbnQpIEdMLkdMX0FMTF9DTElFTlRfQVRUUklC
X0JJVFMpOwoKICAgICAgICAgICAgICAgIGlmIChoYXZlQ2FjaGVkQ29sb3IpIHsKICAgICAgICAg
ICAgICAgICAgICBpZiAoY2FjaGVkQ29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAg
ICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRS
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjYWNoZWRHLCBjYWNoZWRCLCBjYWNoZWRBKTsKICAgICAgICAgICAgICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikg
bmV3QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRDb2xvcik7CiAgICAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAg
ICAgbmVlZFRvUmVzZXRDb2xvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9
CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0UmVuZGVyRGVsZWdhdGUgaW1wbGVtZW50
cyBSZW5kZXJEZWxlZ2F0ZSB7CiAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZW5zaXR5T25seSgp
IHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgUmVj
dGFuZ2xlMkQgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAg
ICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJT
ZXF1ZW5jZUl0ZXJhdG9yKHN0cikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYyk7
CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKFN0cmluZyBz
dHIsIEZvbnQgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRS
ZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3Jl
YXRlR2x5cGhWZWN0b3IoZnJjLCBzdHIpLCBmcmMpOwogICAgICAgIH0KCiAgICAgICAgcHVibGlj
IFJlY3RhbmdsZTJEIGdldEJvdW5kcyhHbHlwaFZlY3RvciBndiwgRm9udFJlbmRlckNvbnRleHQg
ZnJjKSB7CiAgICAgICAgICAgIHJldHVybiBndi5nZXRWaXN1YWxCb3VuZHMoKTsKICAgICAgICB9
CgogICAgICAgIHB1YmxpYyB2b2lkIGRyYXdHbHlwaFZlY3RvcihHcmFwaGljczJEIGdyYXBoaWNz
LCBHbHlwaFZlY3RvciBzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dCB4LCBpbnQgeSkgewogICAgICAgICAgICBncmFwaGljcy5kcmF3R2x5cGhWZWN0b3Ioc3RyLCB4
LCB5KTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3MyRCBncmFw
aGljcywgU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KSB7CiAgICAgICAgICAgIGdyYXBoaWNzLmRy
YXdTdHJpbmcoc3RyLCB4LCB5KTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CiAgICAvLyBHbHlwaC1ieS1nbHlwaCByZW5kZXJpbmcgc3VwcG9ydAogICAgLy8KCiAgICAvLyBB
IHRlbXBvcmFyeSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBnYXJiYWdlIGNyZWF0aW9uCiAgICBwcml2
YXRlIGNoYXJbXSBzaW5nbGVVbmljb2RlID0gbmV3IGNoYXJbMV07CgogICAgLyoqIEEgR2x5cGgg
cmVwcmVzZW50cyBlaXRoZXIgYSBzaW5nbGUgdW5pY29kZSBnbHlwaCBvciBhCiAgICAgICAgc3Vi
c3RyaW5nIG9mIGNoYXJhY3RlcnMgdG8gYmUgZHJhd24uIFRoZSByZWFzb24gZm9yIHRoZSBkdWFs
CiAgICAgICAgYmVoYXZpb3IgaXMgc28gdGhhdCB3ZSBjYW4gdGFrZSBpbiBhIHNlcXVlbmNlIG9m
IHVuaWNvZGUKICAgICAgICBjaGFyYWN0ZXJzIGFuZCBwYXJ0aXRpb24gdGhlbSBpbnRvIHJ1bnMg
b2YgaW5kaXZpZHVhbCBnbHlwaHMsCiAgICAgICAgYnV0IGlmIHdlIGVuY291bnRlciBjb21wbGV4
IHRleHQgYW5kL29yIHVuaWNvZGUgc2VxdWVuY2VzIHdlCiAgICAgICAgZG9uJ3QgdW5kZXJzdGFu
ZCwgd2UgY2FuIHJlbmRlciB0aGVtIHVzaW5nIHRoZQogICAgICAgIHN0cmluZy1ieS1zdHJpbmcg
bWV0aG9kLiA8UD4KCiAgICAgICAgR2x5cGhzIG5lZWQgdG8gYmUgYWJsZSB0byByZS11cGxvYWQg
dGhlbXNlbHZlcyB0byB0aGUgYmFja2luZwogICAgICAgIHN0b3JlIG9uIGRlbWFuZCBhcyB3ZSBn
byBhbG9uZyBpbiB0aGUgcmVuZGVyIHNlcXVlbmNlLgogICAgKi8KCiAgICBjbGFzcyBHbHlwaCB7
CiAgICAgICAgLy8gSWYgdGhpcyBHbHlwaCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdW5pY29k
ZSBnbHlwaCwgdGhpcwogICAgICAgIC8vIGlzIGl0cyB1bmljb2RlIElELiBJZiBpdCByZXByZXNl
bnRzIGEgU3RyaW5nLCB0aGlzIGlzIC0xLgogICAgICAgIHByaXZhdGUgaW50IHVuaWNvZGVJRDsK
ICAgICAgICAvLyBJZiB0aGUgYWJvdmUgZmllbGQgaXNuJ3QgLTEsIHRoZW4gdGhlc2UgZmllbGRz
IGFyZSB1c2VkLgogICAgICAgIC8vIFRoZSBnbHlwaCBjb2RlIGluIHRoZSBmb250CiAgICAgICAg
cHJpdmF0ZSBpbnQgZ2x5cGhDb2RlOwogICAgICAgIC8vIFRoZSBHbHlwaFByb2R1Y2VyIHdoaWNo
IGNyZWF0ZWQgdXMKICAgICAgICBwcml2YXRlIEdseXBoUHJvZHVjZXIgcHJvZHVjZXI7CiAgICAg
ICAgLy8gVGhlIGFkdmFuY2Ugb2YgdGhpcyBnbHlwaAogICAgICAgIHByaXZhdGUgZmxvYXQgYWR2
YW5jZTsKICAgICAgICAvLyBUaGUgR2x5cGhWZWN0b3IgZm9yIHRoaXMgc2luZ2xlIGNoYXJhY3Rl
cjsgdGhpcyBpcyBwYXNzZWQKICAgICAgICAvLyBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGJ1dCBj
bGVhcmVkIGR1cmluZyB0aGUgdXBsb2FkCiAgICAgICAgLy8gcHJvY2VzcwogICAgICAgIHByaXZh
dGUgR2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUdseXBoVmVjdG9yOwogICAgICAgIC8vIFRoZSBy
ZWN0YW5nbGUgb2YgdGhpcyBnbHlwaCBvbiB0aGUgYmFja2luZyBzdG9yZSwgb3IgbnVsbAogICAg
ICAgIC8vIGlmIGl0IGhhcyBiZWVuIGNsZWFyZWQgZHVlIHRvIHNwYWNlIHByZXNzdXJlCiAgICAg
ICAgcHJpdmF0ZSBSZWN0IGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nOwogICAgICAgIC8vIElm
IHRoaXMgR2x5cGggcmVwcmVzZW50cyBhIFN0cmluZywgdGhpcyBpcyB0aGUgc2VxdWVuY2Ugb2YK
ICAgICAgICAvLyBjaGFyYWN0ZXJzCiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyOwogICAgICAg
IC8vIFdoZXRoZXIgd2UgbmVlZCBhIHZhbGlkIGFkdmFuY2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBz
dHJpbmcKICAgICAgICAvLyAoaS5lLiwgd2hldGhlciBpdCBoYXMgb3RoZXIgc2luZ2xlIGdseXBo
cyBjb21pbmcgYWZ0ZXIgaXQpCiAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRBZHZhbmNlOwoK
ICAgICAgICAvLyBDcmVhdGVzIGEgR2x5cGggcmVwcmVzZW50aW5nIGFuIGluZGl2aWR1YWwgVW5p
Y29kZSBjaGFyYWN0ZXIKICAgICAgICBwdWJsaWMgR2x5cGgoaW50IHVuaWNvZGVJRCwKICAgICAg
ICAgICAgICAgICAgICAgaW50IGdseXBoQ29kZSwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQg
YWR2YW5jZSwKICAgICAgICAgICAgICAgICAgICAgR2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUds
eXBoVmVjdG9yLAogICAgICAgICAgICAgICAgICAgICBHbHlwaFByb2R1Y2VyIHByb2R1Y2VyKSB7
CiAgICAgICAgICAgIHRoaXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAgICAgICAgICB0aGlz
LmdseXBoQ29kZSA9IGdseXBoQ29kZTsKICAgICAgICAgICAgdGhpcy5hZHZhbmNlID0gYWR2YW5j
ZTsKICAgICAgICAgICAgdGhpcy5zaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IgPSBzaW5nbGVVbmlj
b2RlR2x5cGhWZWN0b3I7CiAgICAgICAgICAgIHRoaXMucHJvZHVjZXIgPSBwcm9kdWNlcjsKICAg
ICAgICB9CgogICAgICAgIC8vIENyZWF0ZXMgYSBHbHlwaCByZXByZXNlbnRpbmcgYSBzZXF1ZW5j
ZSBvZiBjaGFyYWN0ZXJzLCB3aXRoCiAgICAgICAgLy8gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVy
IGFkZGl0aW9uYWwgc2luZ2xlIGdseXBocyBhcmUgYmVpbmcKICAgICAgICAvLyByZW5kZXJlZCBh
ZnRlciBpdAogICAgICAgIHB1YmxpYyBHbHlwaChTdHJpbmcgc3RyLCBib29sZWFuIG5lZWRBZHZh
bmNlKSB7CiAgICAgICAgICAgIHRoaXMuc3RyID0gc3RyOwogICAgICAgICAgICB0aGlzLm5lZWRB
ZHZhbmNlID0gbmVlZEFkdmFuY2U7CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGlz
IGdseXBoJ3MgdW5pY29kZSBJRCAqLwogICAgICAgIHB1YmxpYyBpbnQgZ2V0VW5pY29kZUlEKCkg
ewogICAgICAgICAgICByZXR1cm4gdW5pY29kZUlEOwogICAgICAgIH0KCiAgICAgICAgLyoqIFJl
dHVybnMgdGhpcyBnbHlwaCdzIChmb250LXNwZWNpZmljKSBnbHlwaCBjb2RlICovCiAgICAgICAg
cHVibGljIGludCBnZXRHbHlwaENvZGUoKSB7CiAgICAgICAgICAgIHJldHVybiBnbHlwaENvZGU7
CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGUgYWR2YW5jZSBmb3IgdGhpcyBnbHlw
aCAqLwogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRBZHZhbmNlKCkgewogICAgICAgICAgICByZXR1
cm4gYWR2YW5jZTsKICAgICAgICB9CgogICAgICAgIC8qKiBEcmF3cyB0aGlzIGdseXBoIGFuZCBy
ZXR1cm5zIHRoZSAoeCkgYWR2YW5jZSBmb3IgdGhpcyBnbHlwaCAqLwogICAgICAgIHB1YmxpYyBm
bG9hdCBkcmF3M0QoZmxvYXQgaW5YLCBmbG9hdCBpblksIGZsb2F0IHosIGZsb2F0IHNjYWxlRmFj
dG9yKSB7CiAgICAgICAgICAgIGlmIChzdHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgZHJh
dzNEX1JPQlVTVChzdHIsIGluWCwgaW5ZLCB6LCBzY2FsZUZhY3Rvcik7CiAgICAgICAgICAgICAg
ICBpZiAoIW5lZWRBZHZhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAg
ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGFk
dmFuY2UgZm9yIHRoaXMgc3RyaW5nCiAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBndiA9IGZv
bnQuY3JlYXRlR2x5cGhWZWN0b3IoZ2V0Rm9udFJlbmRlckNvbnRleHQoKSwgc3RyKTsKICAgICAg
ICAgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IGd2LmdldE51bUdseXBocygpOyBpKyspIHsKICAgICAgICAgICAgICAgICAg
ICB0b3RhbEFkdmFuY2UgKz0gZ3YuZ2V0R2x5cGhNZXRyaWNzKGkpLmdldEFkdmFuY2UoKTsKICAg
ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CiAgICAg
ICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNvZGUgcGF0aCB0YWtlbiBmb3Ig
aW5kaXZpZHVhbCBnbHlwaHMKICAgICAgICAgICAgaWYgKGdseXBoUmVjdEZvclRleHR1cmVNYXBw
aW5nID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHVwbG9hZCgpOwogICAgICAgICAgICB9Cgog
ICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKG1QaXBlbGluZWRRdWFkUmVuZGVy
ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIg
PSBuZXcgUGlwZWxpbmVkX1F1YWRSZW5kZXJlcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAg
ICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdTdG9yZSgpOwog
ICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBjYXNlIHdoZXJlIE5QT1QgdGV4dHVyZSBpcyB1c2Vk
IGZvciBiYWNraW5nIHN0b3JlCiAgICAgICAgICAgICAgICBUZXh0dXJlQ29vcmRzIHdob2xlSW1h
Z2VUZXhDb29yZHMgPSByZW5kZXJlci5nZXRUZXh0dXJlKCkuZ2V0SW1hZ2VUZXhDb29yZHMoKTsK
ICAgICAgICAgICAgICAgIGZsb2F0IHhTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMucmlnaHQo
KTsKICAgICAgICAgICAgICAgIGZsb2F0IHlTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMuYm90
dG9tKCk7CgogICAgICAgICAgICAgICAgUmVjdCByZWN0ID0gZ2x5cGhSZWN0Rm9yVGV4dHVyZU1h
cHBpbmc7CiAgICAgICAgICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRleHREYXRhKSByZWN0Lmdl
dFVzZXJEYXRhKCk7CiAgICAgICAgICAgICAgICBkYXRhLm1hcmtVc2VkKCk7CgogICAgICAgICAg
ICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QgPSBkYXRhLm9yaWdSZWN0KCk7CgogICAgICAgICAg
ICAgICAgZmxvYXQgeCA9IGluWCAtIChzY2FsZUZhY3RvciAqIGRhdGEub3JpZ09yaWdpblgoKSk7
CiAgICAgICAgICAgICAgICBmbG9hdCB5ID0gaW5ZIC0gKHNjYWxlRmFjdG9yICogKChmbG9hdCkg
b3JpZ1JlY3QuZ2V0SGVpZ2h0KCkgLSBkYXRhLm9yaWdPcmlnaW5ZKCkpKTsKCiAgICAgICAgICAg
ICAgICBpbnQgdGV4dHVyZXggPSByZWN0LngoKSArIChkYXRhLm9yaWdpbigpLnggLSBkYXRhLm9y
aWdPcmlnaW5YKCkpOwogICAgICAgICAgICAgICAgaW50IHRleHR1cmV5ID0gcmVuZGVyZXIuZ2V0
SGVpZ2h0KCkgLSByZWN0LnkoKSAtIChpbnQpIG9yaWdSZWN0LmdldEhlaWdodCgpIC0KICAgICAg
ICAgICAgICAgICAgICAoZGF0YS5vcmlnaW4oKS55IC0gZGF0YS5vcmlnT3JpZ2luWSgpKTsKICAg
ICAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIG9yaWdSZWN0LmdldFdpZHRoKCk7CiAgICAg
ICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCk7CgogICAg
ICAgICAgICAgICAgZmxvYXQgdHgxID0geFNjYWxlICogKGZsb2F0KSB0ZXh0dXJleCAvIChmbG9h
dCkgcmVuZGVyZXIuZ2V0V2lkdGgoKTsKICAgICAgICAgICAgICAgIGZsb2F0IHR5MSA9IHlTY2Fs
ZSAqICgxLjBmIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsb2F0
KSB0ZXh0dXJleSAvIChmbG9hdCkgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkpKTsKICAgICAgICAgICAg
ICAgIGZsb2F0IHR4MiA9IHhTY2FsZSAqIChmbG9hdCkgKHRleHR1cmV4ICsgd2lkdGgpIC8gKGZs
b2F0KSByZW5kZXJlci5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgZmxvYXQgdHkyID0geVNj
YWxlICogKDEuMGYgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxv
YXQpICh0ZXh0dXJleSArIGhlaWdodCkgLyAoZmxvYXQpIHJlbmRlcmVyLmdldEhlaWdodCgpKSk7
CgogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENvb3JkMmYodHgx
LCB0eTEpOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFZlcnRleDNm
KHgsIHksIHopOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENv
b3JkMmYodHgyLCB0eTEpOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5n
bFZlcnRleDNmKHggKyAod2lkdGggKiBzY2FsZUZhY3RvciksIHksCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeik7CiAgICAgICAgICAgICAgICBtUGlw
ZWxpbmVkUXVhZFJlbmRlcmVyLmdsVGV4Q29vcmQyZih0eDIsIHR5Mik7CiAgICAgICAgICAgICAg
ICBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyLmdsVmVydGV4M2YoeCArICh3aWR0aCAqIHNjYWxlRmFj
dG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5
ICsgKGhlaWdodCAqIHNjYWxlRmFjdG9yKSwgeik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVk
UXVhZFJlbmRlcmVyLmdsVGV4Q29vcmQyZih0eDEsIHR5Mik7CiAgICAgICAgICAgICAgICBtUGlw
ZWxpbmVkUXVhZFJlbmRlcmVyLmdsVmVydGV4M2YoeCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsgKGhlaWdodCAqIHNjYWxlRmFjdG9yKSwgeik7
CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBlLnBy
aW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhZHZhbmNl
OwogICAgICAgIH0KCiAgICAgICAgLyoqIE5vdGlmaWVzIHRoaXMgZ2x5cGggdGhhdCBpdCdzIGJl
ZW4gY2xlYXJlZCBvdXQgb2YgdGhlIGNhY2hlICovCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXIo
KSB7CiAgICAgICAgICAgIGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nID0gbnVsbDsKICAgICAg
ICB9CgogICAgICAgIHByaXZhdGUgdm9pZCB1cGxvYWQoKSB7CiAgICAgICAgICAgIEdseXBoVmVj
dG9yIGd2ID0gZ2V0R2x5cGhWZWN0b3IoKTsKICAgICAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ0JC
b3ggPSBwcmVOb3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKGd2LCBnZXRGb250UmVu
ZGVyQ29udGV4dCgpKSk7CiAgICAgICAgICAgIFJlY3RhbmdsZTJEIGJib3ggPSBub3JtYWxpemUo
b3JpZ0JCb3gpOwogICAgICAgICAgICBQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQoKGludCkgLWJi
b3guZ2V0TWluWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkg
LWJib3guZ2V0TWluWSgpKTsKICAgICAgICAgICAgUmVjdCByZWN0ID0gbmV3IFJlY3QoMCwgMCwg
KGludCkgYmJveC5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
aW50KSBiYm94LmdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
ZXcgVGV4dERhdGEobnVsbCwgb3JpZ2luLCBvcmlnQkJveCwgdW5pY29kZUlEKSk7CiAgICAgICAg
ICAgIHBhY2tlci5hZGQocmVjdCk7CiAgICAgICAgICAgIGdseXBoUmVjdEZvclRleHR1cmVNYXBw
aW5nID0gcmVjdDsKICAgICAgICAgICAgR3JhcGhpY3MyRCBnID0gZ2V0R3JhcGhpY3MyRCgpOwog
ICAgICAgICAgICAvLyBPSywgc2hvdWxkIG5vdyBoYXZlIGFuICh4LCB5KSBmb3IgdGhpcyByZWN0
YW5nbGU7IHJhc3Rlcml6ZQogICAgICAgICAgICAvLyB0aGUgZ2x5cGgKICAgICAgICAgICAgaW50
IHN0cnggPSByZWN0LngoKSArIG9yaWdpbi54OwogICAgICAgICAgICBpbnQgc3RyeSA9IHJlY3Qu
eSgpICsgb3JpZ2luLnk7CgogICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGFyZWEgd2UncmUg
Z29pbmcgdG8gZHJhdyBpbnRvCiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9z
aXRlLkNsZWFyKTsKICAgICAgICAgICAgZy5maWxsUmVjdChyZWN0LngoKSwgcmVjdC55KCksIHJl
Y3QudygpLCByZWN0LmgoKSk7CiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9z
aXRlLlNyYyk7CgogICAgICAgICAgICAvLyBEcmF3IHRoZSBzdHJpbmcKICAgICAgICAgICAgcmVu
ZGVyRGVsZWdhdGUuZHJhd0dseXBoVmVjdG9yKGcsIGd2LCBzdHJ4LCBzdHJ5KTsKCiAgICAgICAg
ICAgIGlmIChEUkFXX0JCT1hFUykgewogICAgICAgICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChU
ZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwogICAgICAgICAgICAgICAgLy8gRHJhdyBhIGJv
dW5kaW5nIGJveCBvbiB0aGUgYmFja2luZyBzdG9yZQogICAgICAgICAgICAgICAgZy5kcmF3UmVj
dChzdHJ4IC0gZGF0YS5vcmlnT3JpZ2luWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBz
dHJ5IC0gZGF0YS5vcmlnT3JpZ2luWSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50
KSBkYXRhLm9yaWdSZWN0KCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGludCkgZGF0YS5vcmlnUmVjdCgpLmdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgIGcuZHJh
d1JlY3Qoc3RyeCAtIGRhdGEub3JpZ2luKCkueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RyeSAtIGRhdGEub3JpZ2luKCkueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53
KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgLy8gTWFyayB0aGlzIHJlZ2lvbiBvZiB0aGUgVGV4dHVyZVJlbmRlcmVyIGFz
IGRpcnR5CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eShyZWN0LngoKSwg
cmVjdC55KCksIHJlY3QudygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmVjdC5oKCkpOwogICAgICAgICAgICAvLyBSZS1yZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCBv
dXIgcHJvZHVjZXIKICAgICAgICAgICAgcHJvZHVjZXIucmVnaXN0ZXIodGhpcyk7CiAgICAgICAg
fQoKICAgICAgICBwcml2YXRlIEdseXBoVmVjdG9yIGdldEdseXBoVmVjdG9yKCkgewogICAgICAg
ICAgICBHbHlwaFZlY3RvciBndiA9IHNpbmdsZVVuaWNvZGVHbHlwaFZlY3RvcjsKICAgICAgICAg
ICAgaWYgKGd2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHNpbmdsZVVuaWNvZGVHbHlwaFZl
Y3RvciA9IG51bGw7IC8vIERvbid0IG5lZWQgdGhpcyBhbnltb3JlCiAgICAgICAgICAgICAgICBy
ZXR1cm4gZ3Y7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IChj
aGFyKSB1bmljb2RlSUQ7CiAgICAgICAgICAgIHJldHVybiBmb250LmNyZWF0ZUdseXBoVmVjdG9y
KGdldEZvbnRSZW5kZXJDb250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgIH0KICAgIH0K
CiAgICBjbGFzcyBHbHlwaFByb2R1Y2VyIHsKICAgICAgICBmaW5hbCBpbnQgdW5kZWZpbmVkID0g
LTI7CiAgICAgICAgRm9udFJlbmRlckNvbnRleHQgZm9udFJlbmRlckNvbnRleHQ7CiAgICAgICAg
TGlzdC8qPEdseXBoPiovIGdseXBoc091dHB1dCA9IG5ldyBBcnJheUxpc3QvKjxHbHlwaD4qLygp
OwogICAgICAgIC8vIFRoZSBtYXBwaW5nIGZyb20gdW5pY29kZSBjaGFyYWN0ZXIgdG8gZm9udC1z
cGVjaWZpYyBnbHlwaCBJRAogICAgICAgIGludFtdIHVuaWNvZGVzMkdseXBoczsKICAgICAgICAv
LyBUaGUgbWFwcGluZyBmcm9tIGdseXBoIElEIHRvIEdseXBoCiAgICAgICAgR2x5cGhbXSBnbHlw
aENhY2hlOwogICAgICAgIC8vIFdlIHJlLXVzZSB0aGlzIGZvciBlYWNoIGluY29taW5nIHN0cmlu
ZwogICAgICAgIENoYXJTZXF1ZW5jZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQ2hhclNlcXVlbmNlSXRl
cmF0b3IoKTsKCiAgICAgICAgR2x5cGhQcm9kdWNlcihpbnQgZm9udExlbmd0aEluR2x5cGhzKSB7
CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBocyA9IG5ldyBpbnRbNTEyXTsKICAgICAgICAgICAg
Z2x5cGhDYWNoZSA9IG5ldyBHbHlwaFtmb250TGVuZ3RoSW5HbHlwaHNdOwogICAgICAgICAgICBj
bGVhckFsbENhY2hlRW50cmllcygpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExpc3QvKjxH
bHlwaD4qLyBnZXRHbHlwaHMoQ2hhclNlcXVlbmNlIGluU3RyaW5nKSB7CiAgICAgICAgICAgIGds
eXBoc091dHB1dC5jbGVhcigpOwogICAgICAgICAgICBpdGVyLmluaXRGcm9tQ2hhclNlcXVlbmNl
KGluU3RyaW5nKTsKICAgICAgICAgICAgR2x5cGhWZWN0b3IgZnVsbFJ1bkdseXBoVmVjdG9yID0g
Zm9udC5jcmVhdGVHbHlwaFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGl0ZXIpOwogICAgICAgICAgICBib29sZWFuIGNvbXBsZXggPSAoZnVsbFJ1bkdseXBoVmVjdG9y
LmdldExheW91dEZsYWdzKCkgIT0gMCk7CiAgICAgICAgICAgIGlmIChjb21wbGV4IHx8IERJU0FC
TEVfR0xZUEhfQ0FDSEUpIHsKICAgICAgICAgICAgICAgIC8vIFB1bnQgdG8gdGhlIHJvYnVzdCB2
ZXJzaW9uIG9mIHRoZSByZW5kZXJlcgogICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFkZChu
ZXcgR2x5cGgoaW5TdHJpbmcudG9TdHJpbmcoKSwgZmFsc2UpKTsKICAgICAgICAgICAgICAgIHJl
dHVybiBnbHlwaHNPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBsZW5ndGhJ
bkdseXBocyA9IGZ1bGxSdW5HbHlwaFZlY3Rvci5nZXROdW1HbHlwaHMoKTsKICAgICAgICAgICAg
aW50IGkgPSAwOwogICAgICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aEluR2x5cGhzKSB7CiAgICAg
ICAgICAgICAgICBHbHlwaCBnbHlwaCA9IGdldEdseXBoKGluU3RyaW5nLCBmdWxsUnVuR2x5cGhW
ZWN0b3IsIGkpOwogICAgICAgICAgICAgICAgaWYgKGdseXBoICE9IG51bGwpIHsKICAgICAgICAg
ICAgICAgICAgICBnbHlwaHNPdXRwdXQuYWRkKGdseXBoKTsKICAgICAgICAgICAgICAgICAgICBp
Kys7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEFzc2Vt
YmxlIGEgcnVuIG9mIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBmaXQgaW4KICAgICAgICAgICAgICAg
ICAgICAvLyB0aGUgY2FjaGUKICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0g
bmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3Ro
SW5HbHlwaHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R2x5cGgoaW5TdHJpbmcs
IGZ1bGxSdW5HbHlwaFZlY3RvciwgaSkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAg
ICBidWYuYXBwZW5kKGluU3RyaW5nLmNoYXJBdChpKyspKTsKICAgICAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFkZChuZXcgR2x5cGgoYnVmLnRvU3Ry
aW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
QW55IG1vcmUgZ2x5cGhzIGFmdGVyIHRoaXMgcnVuPwogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGkgPCBsZW5ndGhJbkdseXBocykpOwogICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBnbHlwaHNPdXRwdXQ7CiAgICAg
ICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBjbGVhckNhY2hlRW50cnkoaW50IHVuaWNvZGVJRCkg
ewogICAgICAgICAgICBpbnQgZ2x5cGhJRCA9IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwog
ICAgICAgICAgICBpZiAoZ2x5cGhJRCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIEds
eXBoIGdseXBoID0gZ2x5cGhDYWNoZVtnbHlwaElEXTsKICAgICAgICAgICAgICAgIGlmIChnbHlw
aCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZ2x5cGguY2xlYXIoKTsKICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgICAgIGdseXBoQ2FjaGVbZ2x5cGhJRF0gPSBudWxsOwogICAg
ICAgICAgICB9CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdID0gdW5kZWZp
bmVkOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBbGxDYWNoZUVudHJpZXMo
KSB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pY29kZXMyR2x5cGhzLmxlbmd0
aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjbGVhckNhY2hlRW50cnkoaSk7CiAgICAgICAgICAg
IH0KICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEdseXBoIGdseXBoKSB7
CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1tnbHlwaC5nZXRVbmljb2RlSUQoKV0gPSBnbHlw
aC5nZXRHbHlwaENvZGUoKTsKICAgICAgICAgICAgZ2x5cGhDYWNoZVtnbHlwaC5nZXRHbHlwaENv
ZGUoKV0gPSBnbHlwaDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRHbHlwaFBp
eGVsV2lkdGgoY2hhciB1bmljb2RlSUQpIHsKICAgICAgICAgICAgR2x5cGggZ2x5cGggPSBnZXRH
bHlwaCh1bmljb2RlSUQpOwogICAgICAgICAgICBpZiAoZ2x5cGggIT0gbnVsbCkgewogICAgICAg
ICAgICAgICAgcmV0dXJuIGdseXBoLmdldEFkdmFuY2UoKTsKICAgICAgICAgICAgfQoKICAgICAg
ICAgICAgLy8gSGF2ZSB0byBkbyB0aGlzIHRoZSBoYXJkIC8gdW5jYWNoZWQgd2F5CiAgICAgICAg
ICAgIHNpbmdsZVVuaWNvZGVbMF0gPSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9y
IGd2ID0gZm9udC5jcmVhdGVHbHlwaFZlY3Rvcihmb250UmVuZGVyQ29udGV4dCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzaW5nbGVVbmljb2RlKTsKICAgICAgICAgICAgcmV0dXJuIGd2LmdldEdseXBoTWV0cmljcygw
KS5nZXRBZHZhbmNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm5zIGEgZ2x5cGggb2Jq
ZWN0IGZvciB0aGlzIHNpbmdsZSBnbHlwaC4gUmV0dXJucyBudWxsCiAgICAgICAgLy8gaWYgdGhl
IHVuaWNvZGUgb3IgZ2x5cGggSUQgd291bGQgYmUgb3V0IG9mIGJvdW5kcyBvZiB0aGUKICAgICAg
ICAvLyBnbHlwaCBjYWNoZS4KICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKENoYXJTZXF1
ZW5jZSBpblN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoVmVjdG9y
IGZ1bGxSdW5HbHlwaFZlY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBp
bmRleCkgewogICAgICAgICAgICBjaGFyIHVuaWNvZGVJRCA9IGluU3RyaW5nLmNoYXJBdChpbmRl
eCk7CgogICAgICAgICAgICBpZiAodW5pY29kZUlEID49IHVuaWNvZGVzMkdseXBocy5sZW5ndGgp
IHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAg
ICBpbnQgZ2x5cGhJRCA9IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwogICAgICAgICAgICBp
ZiAoZ2x5cGhJRCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnbHlwaENh
Y2hlW2dseXBoSURdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNdXN0IGZhYnJpY2F0
ZSB0aGUgZ2x5cGgKICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IHVuaWNvZGVJRDsKICAg
ICAgICAgICAgR2x5cGhWZWN0b3IgZ3YgPSBmb250LmNyZWF0ZUdseXBoVmVjdG9yKGdldEZvbnRS
ZW5kZXJDb250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgICAgICByZXR1cm4gZ2V0R2x5
cGgodW5pY29kZUlELCBndiwgZnVsbFJ1bkdseXBoVmVjdG9yLmdldEdseXBoTWV0cmljcyhpbmRl
eCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gSXQncyB1bmNsZWFyIHdoZXRoZXIgdGhpcyB2YXJp
YW50IG1pZ2h0IHByb2R1Y2UgbGVzcwogICAgICAgIC8vIG9wdGltYWwgcmVzdWx0cyB0aGFuIGlm
IHdlIGNhbiBzZWUgdGhlIGVudGlyZSBHbHlwaFZlY3RvcgogICAgICAgIC8vIGZvciB0aGUgaW5j
b21pbmcgc3RyaW5nCiAgICAgICAgcHJpdmF0ZSBHbHlwaCBnZXRHbHlwaChpbnQgdW5pY29kZUlE
KSB7CiAgICAgICAgICAgIGlmICh1bmljb2RlSUQgPj0gdW5pY29kZXMyR2x5cGhzLmxlbmd0aCkg
ewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAg
IGludCBnbHlwaElEID0gdW5pY29kZXMyR2x5cGhzW3VuaWNvZGVJRF07CiAgICAgICAgICAgIGlm
IChnbHlwaElEICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGdseXBoQ2Fj
aGVbZ2x5cGhJRF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9
IChjaGFyKSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZm9udC5jcmVh
dGVHbHlwaFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLCBzaW5nbGVVbmljb2RlKTsKICAg
ICAgICAgICAgcmV0dXJuIGdldEdseXBoKHVuaWNvZGVJRCwgZ3YsIGd2LmdldEdseXBoTWV0cmlj
cygwKSk7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKGludCB1bmlj
b2RlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBzaW5nbGVV
bmljb2RlR2x5cGhWZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaE1l
dHJpY3MgbWV0cmljcykgewogICAgICAgICAgICBpbnQgZ2x5cGhDb2RlID0gc2luZ2xlVW5pY29k
ZUdseXBoVmVjdG9yLmdldEdseXBoQ29kZSgwKTsKICAgICAgICAgICAgLy8gSGF2ZSBzZWVuIGh1
Z2UgZ2x5cGggY29kZXMgKDY1NTM2KSBjb21pbmcgb3V0IG9mIHNvbWUgZm9udHMgaW4gc29tZSBV
bmljb2RlIHNpdHVhdGlvbnMKICAgICAgICAgICAgaWYgKGdseXBoQ29kZSA+PSBnbHlwaENhY2hl
Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAg
ICAgICAgICAgR2x5cGggZ2x5cGggPSBuZXcgR2x5cGgodW5pY29kZUlELAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBnbHlwaENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1ldHJpY3MuZ2V0QWR2YW5jZSgpLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHRoaXMpOwogICAgICAgICAgICByZWdpc3RlcihnbHlwaCk7CiAg
ICAgICAgICAgIHJldHVybiBnbHlwaDsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgUGlwZWxp
bmVkX1F1YWRSZW5kZXJlciB7CiAgICAgICAgaW50IG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2Vz
UGlwZWxpbmUgPSAwOwogICAgICAgIEZsb2F0QnVmZmVyIG1UZXhDb29yZHM7CiAgICAgICAgRmxv
YXRCdWZmZXIgbVZlcnRDb29yZHM7CiAgICAgICAgYm9vbGVhbiB1c2luZ1ZCT3M7CiAgICAgICAg
aW50IG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2VzOwogICAgICAgIGludCBtVkJPX0Zvcl9S
ZXN1YWJsZVRpbGVUZXhDb29yZHM7CgogICAgICAgIFBpcGVsaW5lZF9RdWFkUmVuZGVyZXIoKSB7
CiAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwogICAgICAgICAgICBtVmVy
dENvb3JkcyA9IEJ1ZmZlclV0aWwubmV3RmxvYXRCdWZmZXIoa1RvdGFsQnVmZmVyU2l6ZUNvb3Jk
c1ZlcnRzKTsKICAgICAgICAgICAgbVRleENvb3JkcyA9IEJ1ZmZlclV0aWwubmV3RmxvYXRCdWZm
ZXIoa1RvdGFsQnVmZmVyU2l6ZUNvb3Jkc1RleCk7CgogICAgICAgICAgICB1c2luZ1ZCT3MgPSBp
c1ZCT0F2YWlsYWJsZShnbCk7CgogICAgICAgICAgICBpZiAodXNpbmdWQk9zKSB7CiAgICAgICAg
ICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGludFtdIHZib3MgPSBuZXcgaW50WzJd
OwogICAgICAgICAgICAgICAgICAgIGdsLmdsR2VuQnVmZmVycygyLCBJbnRCdWZmZXIud3JhcCh2
Ym9zKSk7CgogICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2Vz
ID0gdmJvc1swXTsKICAgICAgICAgICAgICAgICAgICBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVUZXhD
b29yZHMgPSB2Ym9zWzFdOwoKICAgICAgICAgICAgICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wu
R0xfQVJSQVlfQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVkJP
X0Zvcl9SZXN1YWJsZVRpbGVWZXJ0aWNlcyk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCdWZm
ZXJEYXRhKEdMLkdMX0FSUkFZX0JVRkZFUiwga1RvdGFsQnVmZmVyU2l6ZUJ5dGVzVmVydHMsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEdMLkdMX1NUUkVBTV9EUkFX
KTsgLy8gc3RyZWFtIGRyYXcgYmVjYXVzZSB0aGlzIGlzIGEgc2luZ2xlIHF1YWQgdXNlIHBpcGVs
aW5lCgogICAgICAgICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJBWV9CVUZG
RVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxl
VGlsZVRleENvb3Jkcyk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCdWZmZXJEYXRhKEdMLkdM
X0FSUkFZX0JVRkZFUiwga1RvdGFsQnVmZmVyU2l6ZUJ5dGVzVGV4LAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBudWxsLCBHTC5HTF9TVFJFQU1fRFJBVyk7IC8vIHN0cmVhbSBk
cmF3IGJlY2F1c2UgdGhpcyBpcyBhIHNpbmdsZSBxdWFkIHVzZSBwaXBlbGluZQogICAgICAgICAg
ICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICBpc0V4dGVu
c2lvbkF2YWlsYWJsZV9WQk8gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB1c2luZ1ZCT3Mg
PSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAg
ICAgcHVibGljIHZvaWQgZ2xUZXhDb29yZDJmKGZsb2F0IHYsIGZsb2F0IHYxKSB7CiAgICAgICAg
ICAgIG1UZXhDb29yZHMucHV0KHYpOwogICAgICAgICAgICBtVGV4Q29vcmRzLnB1dCh2MSk7CiAg
ICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBnbFZlcnRleDNmKGZsb2F0IGluWCwgZmxvYXQg
aW5ZLCBmbG9hdCBpblopIHsKICAgICAgICAgICAgbVZlcnRDb29yZHMucHV0KGluWCk7CiAgICAg
ICAgICAgIG1WZXJ0Q29vcmRzLnB1dChpblkpOwogICAgICAgICAgICBtVmVydENvb3Jkcy5wdXQo
aW5aKTsKCiAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUrKzsK
CiAgICAgICAgICAgIGlmIChtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lID49IGtU
b3RhbEJ1ZmZlclNpemVWZXJ0cykgewogICAgICAgICAgICAgICAgdGhpcy5kcmF3KCk7CiAgICAg
ICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCBkcmF3KCkgewogICAgICAg
ICAgICBpZiAodXNlVmVydGV4QXJyYXlzKSB7CiAgICAgICAgICAgICAgICBkcmF3VmVydGV4QXJy
YXlzKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkcmF3SU1NRURJQVRF
KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCBkcmF3VmVy
dGV4QXJyYXlzKCkgewogICAgICAgICAgICBpZiAobU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQ
aXBlbGluZSA+IDApIHsKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgp
OwoKICAgICAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdT
dG9yZSgpOwogICAgICAgICAgICAgICAgVGV4dHVyZSB0ZXh0dXJlID0gcmVuZGVyZXIuZ2V0VGV4
dHVyZSgpOyAvLyB0cmlnZ2VycyB0ZXh0dXJlIHVwbG9hZHMuICBNYXliZSB0aGlzIHNob3VsZCBi
ZSBtb3JlIG9idmlvdXM/CgogICAgICAgICAgICAgICAgbVZlcnRDb29yZHMucmV3aW5kKCk7CiAg
ICAgICAgICAgICAgICBtVGV4Q29vcmRzLnJld2luZCgpOwoKICAgICAgICAgICAgICAgIGdsLmds
RW5hYmxlQ2xpZW50U3RhdGUoR0wuR0xfVkVSVEVYX0FSUkFZKTsKCiAgICAgICAgICAgICAgICBp
ZiAodXNpbmdWQk9zKSB7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdM
X0FSUkFZX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZCT19G
b3JfUmVzdWFibGVUaWxlVmVydGljZXMpOwogICAgICAgICAgICAgICAgICAgIGdsLmdsQnVmZmVy
U3ViRGF0YShHTC5HTF9BUlJBWV9CVUZGRVIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgKiBrU2l6ZUlu
Qnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbVZlcnRDb29yZHMpOyAvLyB1cGxvYWQgb25seSB0aGUgbmV3IHN0dWZmCiAg
ICAgICAgICAgICAgICAgICAgZ2wuZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMLkdMX0ZMT0FULCAwLCAw
KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xWZXJ0
ZXhQb2ludGVyKDMsIEdMLkdMX0ZMT0FULCAwLCBtVmVydENvb3Jkcyk7CiAgICAgICAgICAgICAg
ICB9CgogICAgICAgICAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTC5HTF9URVhUVVJF
X0NPT1JEX0FSUkFZKTsKCiAgICAgICAgICAgICAgICBpZiAodXNpbmdWQk9zKSB7CiAgICAgICAg
ICAgICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZCT19Gb3JfUmVzdWFibGVUaWxlVGV4Q29vcmRz
KTsKICAgICAgICAgICAgICAgICAgICBnbC5nbEJ1ZmZlclN1YkRhdGEoR0wuR0xfQVJSQVlfQlVG
RkVSLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0c3RhbmRp
bmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lICoga1NpemVJbkJ5dGVzX09uZVZlcnRpY2VzX1RleERh
dGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXhDb29yZHMpOyAv
LyB1cGxvYWQgb25seSB0aGUgbmV3IHN0dWZmCiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhD
b29yZFBvaW50ZXIoMiwgR0wuR0xfRkxPQVQsIDAsIDApOwogICAgICAgICAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgICAgICAgICBnbC5nbFRleENvb3JkUG9pbnRlcigyLCBHTC5HTF9GTE9B
VCwgMCwgbVRleENvb3Jkcyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZ2wu
Z2xEcmF3QXJyYXlzKEdMLkdMX1FVQURTLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUpOwoKICAgICAgICAgICAgICAg
IG1WZXJ0Q29vcmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAgbVRleENvb3Jkcy5yZXdpbmQo
KTsKICAgICAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgPSAw
OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0lNTUVE
SUFURSgpIHsKICAgICAgICAgICAgaWYgKG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxp
bmUgPiAwKSB7CiAgICAgICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXIgPSBnZXRC
YWNraW5nU3RvcmUoKTsKICAgICAgICAgICAgICAgIFRleHR1cmUgdGV4dHVyZSA9IHJlbmRlcmVy
LmdldFRleHR1cmUoKTsgLy8gdHJpZ2dlcnMgdGV4dHVyZSB1cGxvYWRzLiAgTWF5YmUgdGhpcyBz
aG91bGQgYmUgbW9yZSBvYnZpb3VzPwoKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1
cnJlbnRHTCgpOwogICAgICAgICAgICAgICAgZ2wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7CgogICAg
ICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyT2ZRdWFkcyA9
IG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgLyA0OwogICAgICAgICAgICAgICAg
ICAgIG1WZXJ0Q29vcmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgIG1UZXhDb29yZHMu
cmV3aW5kKCk7CgogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVy
T2ZRdWFkczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4Q29vcmQyZiht
VGV4Q29vcmRzLmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAg
ICAgZ2wuZ2xWZXJ0ZXgzZihtVmVydENvb3Jkcy5nZXQoKSwgbVZlcnRDb29yZHMuZ2V0KCksCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlcnRDb29yZHMuZ2V0KCkpOwoK
ICAgICAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZDJmKG1UZXhDb29yZHMuZ2V0KCks
IG1UZXhDb29yZHMuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBnbC5nbFZlcnRleDNm
KG1WZXJ0Q29vcmRzLmdldCgpLCBtVmVydENvb3Jkcy5nZXQoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQoKSk7CgogICAgICAgICAgICAgICAg
ICAgICAgICBnbC5nbFRleENvb3JkMmYobVRleENvb3Jkcy5nZXQoKSwgbVRleENvb3Jkcy5nZXQo
KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4M2YobVZlcnRDb29yZHMuZ2V0
KCksIG1WZXJ0Q29vcmRzLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1WZXJ0Q29vcmRzLmdldCgpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4
Q29vcmQyZihtVGV4Q29vcmRzLmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsKICAgICAgICAgICAg
ICAgICAgICAgICAgZ2wuZ2xWZXJ0ZXgzZihtVmVydENvb3Jkcy5nZXQoKSwgbVZlcnRDb29yZHMu
Z2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlcnRDb29yZHMu
Z2V0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4
Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAg
ICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xFbmQoKTsK
ICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5yZXdpbmQoKTsKICAgICAgICAgICAgICAg
ICAgICBtVGV4Q29vcmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgIG1PdXRzdGFuZGlu
Z0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICB9CiAgICAgICAgfQogICAgfQoKICAgIGNsYXNzIERlYnVnTGlzdGVuZXIgaW1wbGVtZW50cyBH
TEV2ZW50TGlzdGVuZXIgewogICAgICAgIHByaXZhdGUgR0xVIGdsdSA9IG5ldyBHTFUoKTsKICAg
ICAgICBwcml2YXRlIEZyYW1lIGZyYW1lOwoKICAgICAgICBEZWJ1Z0xpc3RlbmVyKEZyYW1lIGZy
YW1lKSB7CiAgICAgICAgICAgIHRoaXMuZnJhbWUgPSBmcmFtZTsKICAgICAgICB9CgogICAgICAg
IHB1YmxpYyB2b2lkIGRpc3BsYXkoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUpIHsKICAgICAgICAg
ICAgR0wgZ2wgPSBkcmF3YWJsZS5nZXRHTCgpOwogICAgICAgICAgICBnbC5nbENsZWFyKEdMLkdM
X0RFUFRIX0JVRkZFUl9CSVQgfCBHTC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKCiAgICAgICAgICAg
IGlmIChwYWNrZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAg
ICB9CgogICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZCA9IGdldEJhY2tpbmdTdG9yZSgp
OwogICAgICAgICAgICBmaW5hbCBpbnQgdyA9IHJlbmQuZ2V0V2lkdGgoKTsKICAgICAgICAgICAg
ZmluYWwgaW50IGggPSByZW5kLmdldEhlaWdodCgpOwogICAgICAgICAgICByZW5kLmJlZ2luT3J0
aG9SZW5kZXJpbmcodywgaCk7CiAgICAgICAgICAgIHJlbmQuZHJhd09ydGhvUmVjdCgwLCAwKTsK
ICAgICAgICAgICAgcmVuZC5lbmRPcnRob1JlbmRlcmluZygpOwoKICAgICAgICAgICAgaWYgKChm
cmFtZS5nZXRXaWR0aCgpICE9IHcpIHx8IChmcmFtZS5nZXRIZWlnaHQoKSAhPSBoKSkgewogICAg
ICAgICAgICAgICAgRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7CiAgICAg
ICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZyYW1lLnNldFNpemUodywgaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAg
Ly8gVW51c2VkIG1ldGhvZHMKICAgICAgICBwdWJsaWMgdm9pZCBpbml0KEdMQXV0b0RyYXdhYmxl
IGRyYXdhYmxlKSB7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCByZXNoYXBlKEdMQXV0
b0RyYXdhYmxlIGRyYXdhYmxlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2
b2lkIGRpc3BsYXlDaGFuZ2VkKEdMQXV0b0RyYXdhYmxlIGRyYXdhYmxlLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbW9kZUNoYW5nZWQsIGJvb2xlYW4gZGV2aWNl
Q2hhbmdlZCkgewogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldHMgd2hldGhlciB2
ZXJ0ZXggYXJyYXlzIGFyZSBiZWluZyB1c2VkIGludGVybmFsbHkgZm9yCiAgICAgKiByZW5kZXJp
bmcsIG9yIHdoZXRoZXIgdGV4dCBpcyByZW5kZXJlZCB1c2luZyB0aGUgT3BlbkdMCiAgICAgKiBp
bW1lZGlhdGUgbW9kZSBjb21tYW5kcy4gVGhpcyBpcyBwcm92aWRlZCBhcyBhIGNvbmNlc3Npb24g
Zm9yCiAgICAgKiBjZXJ0YWluIGdyYXBoaWNzIGNhcmRzIHdoaWNoIGhhdmUgcG9vciB2ZXJ0ZXgg
YXJyYXkKICAgICAqIHBlcmZvcm1hbmNlLiBEZWZhdWx0cyB0byB0cnVlLgogICAgICovCiAgICBw
dWJsaWMgdm9pZCBzZXRVc2VWZXJ0ZXhBcnJheXMoYm9vbGVhbiB1c2VWZXJ0ZXhBcnJheXMpIHsK
ICAgICAgICB0aGlzLnVzZVZlcnRleEFycmF5cyA9IHVzZVZlcnRleEFycmF5czsKICAgIH0KCiAg
ICAvKioKICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHZlcnRleCBhcnJheXMgYXJlIGJlaW5nIHVz
ZWQgaW50ZXJuYWxseSBmb3IKICAgICAqIHJlbmRlcmluZywgb3Igd2hldGhlciB0ZXh0IGlzIHJl
bmRlcmVkIHVzaW5nIHRoZSBPcGVuR0wKICAgICAqIGltbWVkaWF0ZSBtb2RlIGNvbW1hbmRzLiBE
ZWZhdWx0cyB0byB0cnVlLgogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VWZXJ0ZXhB
cnJheXMoKSB7CiAgICAgICAgcmV0dXJuIHVzZVZlcnRleEFycmF5czsKICAgIH0KCiAgICAvKioK
ICAgICAqIFNldHMgd2hldGhlciBzbW9vdGhpbmcgKGkuZS4sIEdMX0xJTkVBUiBmaWx0ZXJpbmcp
IGlzIGVuYWJsZWQKICAgICAqIGluIHRoZSBiYWNraW5nIFRleHR1cmVSZW5kZXJlciBvZiB0aGlz
IFRleHRSZW5kZXJlci4gQSBmZXcKICAgICAqIGdyYXBoaWNzIGNhcmRzIGRvIG5vdCBiZWhhdmUg
d2VsbCB3aGVuIHRoaXMgaXMgZW5hYmxlZCwKICAgICAqIHJlc3VsdGluZyBpbiBmdXp6eSB0ZXh0
LiBEZWZhdWx0cyB0byB0cnVlLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRTbW9vdGhpbmco
Ym9vbGVhbiBzbW9vdGhpbmcpIHsKICAgICAgICB0aGlzLnNtb290aGluZyA9IHNtb290aGluZzsK
ICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRTbW9vdGhpbmcoc21vb3RoaW5nKTsKICAgIH0K
CiAgICAvKioKICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHNtb290aGluZyBpcyBlbmFibGVkIGlu
IHRoZSBiYWNraW5nCiAgICAgKiBUZXh0dXJlUmVuZGVyZXIgb2YgdGhpcyBUZXh0UmVuZGVyZXIu
IEEgZmV3IGdyYXBoaWNzIGNhcmRzIGRvCiAgICAgKiBub3QgYmVoYXZlIHdlbGwgd2hlbiB0aGlz
IGlzIGVuYWJsZWQsIHJlc3VsdGluZyBpbiBmdXp6eSB0ZXh0LgogICAgICogRGVmYXVsdHMgdG8g
dHJ1ZS4KICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gZ2V0U21vb3RoaW5nKCkgewogICAgICAg
IHJldHVybiBzbW9vdGhpbmc7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGlzVkJPQXZhaWxh
YmxlKEdMIGdsKSB7CiAgICAgICAgaWYgKCFjaGVja0Zvcl9pc0V4dGVuc2lvbkF2YWlsYWJsZV9W
Qk8pIHsKICAgICAgICAgICAgaXNFeHRlbnNpb25BdmFpbGFibGVfVkJPID0gZ2wuaXNFeHRlbnNp
b25BdmFpbGFibGUoIkdMX1ZFUlNJT05fMV81Iik7CgkgICAgLyoqCgkgICAgICogR0xfQVJCX3Zl
cnRleF9idWZmZXJfb2JqZWN0IGlzIGF2YWlsYWJsZSBpbiBPcGVuR0wgMS40IGFuZCBzb21ldGlt
ZXMKICAgICAgICAgICAgICogaW4gT3BlbkdMIDEuMy4gTWl4aW5nIHZlcnRleCBhcnJheXMgYW5k
IFZCTyBjYW4gY2F1c2Ugc29tZSBwcm9ibGVtcyAKICAgICAgICAgICAgICogd2hlbiBjYWxsaW5n
IGdsVmVydGV4UG9pbnRlciBmcm9tIHRoZSBUZXh0UmVuZGVyZXIgd2hlcmVhcyAKICAgICAgICAg
ICAgICogZ2xCaW5kQnVmZmVyQVJCIHdhcyBjYWxsZWQgYmVmb3JlIGluIG9yZGVyIHRvIGJpbmQg
YSBWQk8gYmVjYXVzZSBubyBWQk8gCgkgICAgICogbXVzdCBiZSBhbHJlYWR5IGJvdW5kIHdoZW4g
Y2FsbGluZyBnbFZlcnRleFBvaW50ZXIgd2l0aCBhIE5JTyAKCSAgICAgKiBidWZmZXIgYXMgbGFz
dCBhcmd1bWVudC4KCSAgICAgKiBXZSBjYW5ub3QgYXNrIHRoZSBwcm9ncmFtbWVycyB0byBleHBs
aWNpdGx5IHVuYmluZCB0aGVpciBWQk9zCgkgICAgICogdG8gYXZvaWQgdGhpcyBwcm9ibGVtIGJl
Y2F1c2UgaXQgaGFzIGFuIGltcG9ydGFudCBjb3N0IAoJICAgICAqIGVzcGVjaWFsbHkgZm9yIHN0
YXRpYyBWQk9zLgoJICAgICAqLwoJICAgIGlmICghaXNFeHRlbnNpb25BdmFpbGFibGVfVkJPKSB7
CgkgICAgICAgIGlmIChnbC5pc0V4dGVuc2lvbkF2YWlsYWJsZSgiR0xfVkVSU0lPTl8xXzQiKSB8
fCBnbC5pc0V4dGVuc2lvbkF2YWlsYWJsZSgiR0xfVkVSU0lPTl8xXzMiKSkgewoJCSAgICBpZiAo
Z2wuaXNFeHRlbnNpb25BdmFpbGFibGUoIkdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdCIpIAoJ
CSAgICAgICAgJiYgZ2wuaXNGdW5jdGlvbkF2YWlsYWJsZSgiZ2xCaW5kQnVmZmVyQVJCIikKCQkJ
JiYgZ2wuaXNGdW5jdGlvbkF2YWlsYWJsZSgiZ2xCdWZmZXJEYXRhQVJCIikKCQkJJiYgZ2wuaXNG
dW5jdGlvbkF2YWlsYWJsZSgiZ2xHZW5CdWZmZXJzQVJCIikpIHsKCQkJaXNFeHRlbnNpb25BdmFp
bGFibGVfVkJPID0gdHJ1ZTsKCSAgICAgICAgICAgIH0KCQl9CgkgICAgfQogICAgICAgICAgICBj
aGVja0Zvcl9pc0V4dGVuc2lvbkF2YWlsYWJsZV9WQk8gPSB0cnVlOwogICAgICAgIH0KICAgICAg
ICByZXR1cm4gaXNFeHRlbnNpb25BdmFpbGFibGVfVkJPOwogICAgfQp9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>130</attachid>
            <date>2008-06-03 05:46:00 +0200</date>
            <delta_ts>2008-06-03 05:46:00 +0200</delta_ts>
            <desc>Cleanest bug fix version 3 following Kenneth Russell&apos;s suggestions</desc>
            <filename>TextRenderer.java</filename>
            <type>text/plain</type>
            <size>81352</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChjKSAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKICogbWV0OgogKgog
KiAtIFJlZGlzdHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIC0gUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgogKgogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIElu
Yy4gb3IgdGhlIG5hbWVzIG9mCiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRoaXMgc29mdHdhcmUg
aXMgcHJvdmlkZWQgIkFTIElTLCIgd2l0aG91dCBhIHdhcnJhbnR5IG9mIGFueSBraW5kLiBBTEwK
ICogRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FS
UkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJ
TElUWSwgRklUTkVTUyBGT1IgQQogKiBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdF
TUVOVCwgQVJFIEhFUkVCWSBFWENMVURFRC4gU1VOCiAqIE1JQ1JPU1lTVEVNUywgSU5DLiAoIlNV
TiIpIEFORCBJVFMgTElDRU5TT1JTIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SCiAqIEFOWSBEQU1B
R0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIFVTSU5HLCBNT0RJRllJTkcg
T1IKICogRElTVFJJQlVUSU5HIFRISVMgU09GVFdBUkUgT1IgSVRTIERFUklWQVRJVkVTLiBJTiBO
TyBFVkVOVCBXSUxMIFNVTiBPUgogKiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIExP
U1QgUkVWRU5VRSwgUFJPRklUIE9SIERBVEEsIE9SIEZPUgogKiBESVJFQ1QsIElORElSRUNULCBT
UEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SIFBVTklUSVZFCiAqIERBTUFHRVMs
IEhPV0VWRVIgQ0FVU0VEIEFORCBSRUdBUkRMRVNTIE9GIFRIRSBUSEVPUlkgT0YgTElBQklMSVRZ
LAogKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRgogKiBTVU4gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0VTLgogKgogKiBZb3UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIHNvZnR3
YXJlIGlzIG5vdCBkZXNpZ25lZCBvciBpbnRlbmRlZCBmb3IgdXNlCiAqIGluIHRoZSBkZXNpZ24s
IGNvbnN0cnVjdGlvbiwgb3BlcmF0aW9uIG9yIG1haW50ZW5hbmNlIG9mIGFueSBudWNsZWFyCiAq
IGZhY2lsaXR5LgogKgogKiBTdW4gZ3JhdGVmdWxseSBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIHNv
ZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGF1dGhvcmVkCiAqIGFuZCBkZXZlbG9wZWQgYnkgS2VubmV0
aCBCcmFkbGV5IFJ1c3NlbGwgYW5kIENocmlzdG9waGVyIEpvaG4gS2xpbmUuCiAqLwpwYWNrYWdl
IGNvbS5zdW4ub3BlbmdsLnV0aWwuajJkOwoKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwuKjsK
aW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwucGFja3JlY3QuKjsKaW1wb3J0IGNvbS5zdW4ub3Bl
bmdsLnV0aWwuKjsKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLnV0aWwudGV4dHVyZS4qOwoKaW1wb3J0
IGphdmEuYXd0LkFscGhhQ29tcG9zaXRlOwppbXBvcnQgamF2YS5hd3QuQ29sb3I7CmltcG9ydCBq
YXZhLmF3dC5Db21wb3NpdGU7CgovLyBGb3IgZGVidWdnaW5nIHB1cnBvc2VzCmltcG9ydCBqYXZh
LmF3dC5FdmVudFF1ZXVlOwppbXBvcnQgamF2YS5hd3QuRm9udDsKaW1wb3J0IGphdmEuYXd0LkZy
YW1lOwppbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKaW1wb3J0IGphdmEuYXd0LkltYWdlOwpp
bXBvcnQgamF2YS5hd3QuUG9pbnQ7CmltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKaW1w
b3J0IGphdmEuYXd0LmV2ZW50Lio7CmltcG9ydCBqYXZhLmF3dC5mb250Lio7CmltcG9ydCBqYXZh
LmF3dC5nZW9tLio7CgppbXBvcnQgamF2YS5uaW8uKjsKCmltcG9ydCBqYXZhLnRleHQuKjsKCmlt
cG9ydCBqYXZhLnV0aWwuKjsKCmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuKjsKaW1wb3J0IGph
dmF4Lm1lZGlhLm9wZW5nbC5nbHUuKjsKCgovKiogUmVuZGVycyBiaXRtYXBwZWQgSmF2YSAyRCB0
ZXh0IGludG8gYW4gT3BlbkdMIHdpbmRvdyB3aXRoIGhpZ2gKICAgIHBlcmZvcm1hbmNlLCBmdWxs
IFVuaWNvZGUgc3VwcG9ydCwgYW5kIGEgc2ltcGxlIEFQSS4gUGVyZm9ybXMKICAgIGFwcHJvcHJp
YXRlIGNhY2hpbmcgb2YgdGV4dCByZW5kZXJpbmcgcmVzdWx0cyBpbiBhbiBPcGVuR0wgdGV4dHVy
ZQogICAgaW50ZXJuYWxseSB0byBhdm9pZCByZXBlYXRlZCBmb250IHJhc3Rlcml6YXRpb24uIFRo
ZSBjYWNoaW5nIGlzCiAgICBjb21wbGV0ZWx5IGF1dG9tYXRpYywgZG9lcyBub3QgcmVxdWlyZSBh
bnkgdXNlciBpbnRlcnZlbnRpb24sIGFuZAogICAgaGFzIG5vIHZpc2libGUgY29udHJvbHMgaW4g
dGhlIHB1YmxpYyBBUEkuIDxQPgoKICAgIFVzaW5nIHRoZSB7QGxpbmsgVGV4dFJlbmRlcmVyIFRl
eHRSZW5kZXJlcn0gaXMgc2ltcGxlLiBBZGQgYQogICAgIjxjb2RlPlRleHRSZW5kZXJlciByZW5k
ZXJlcjs8L2NvZGU+IiBmaWVsZCB0byB5b3VyIHtAbGluawogICAgamF2YXgubWVkaWEub3Blbmds
LkdMRXZlbnRMaXN0ZW5lciBHTEV2ZW50TGlzdGVuZXJ9LiBJbiB5b3VyIHtAbGluawogICAgamF2
YXgubWVkaWEub3BlbmdsLkdMRXZlbnRMaXN0ZW5lciNpbml0IGluaXR9IG1ldGhvZCwgYWRkOgoK
ICAgIDxQUkU+CiAgICByZW5kZXJlciA9IG5ldyBUZXh0UmVuZGVyZXIobmV3IEZvbnQoIlNhbnNT
ZXJpZiIsIEZvbnQuQk9MRCwgMzYpKTsKICAgIDwvUFJFPgoKICAgIDxQPiBJbiB0aGUge0BsaW5r
IGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIjZGlzcGxheSBkaXNwbGF5fSBtZXRo
b2Qgb2YgeW91cgogICAge0BsaW5rIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIg
R0xFdmVudExpc3RlbmVyfSwgYWRkOgogICAgPFBSRT4KICAgIHJlbmRlcmVyLmJlZ2luUmVuZGVy
aW5nKGRyYXdhYmxlLmdldFdpZHRoKCksIGRyYXdhYmxlLmdldEhlaWdodCgpKTsKICAgIC8vIG9w
dGlvbmFsbHkgc2V0IHRoZSBjb2xvcgogICAgcmVuZGVyZXIuc2V0Q29sb3IoMS4wZiwgMC4yZiwg
MC4yZiwgMC44Zik7CiAgICByZW5kZXJlci5kcmF3KCJUZXh0IHRvIGRyYXciLCB4UG9zaXRpb24s
IHlQb3NpdGlvbik7CiAgICAvLyAuLi4gbW9yZSBkcmF3IGNvbW1hbmRzLCBjb2xvciBjaGFuZ2Vz
LCBldGMuCiAgICByZW5kZXJlci5lbmRSZW5kZXJpbmcoKTsKICAgIDwvUFJFPgoKICAgIFVubGVz
cyB5b3UgYXJlIHNoYXJpbmcgdGV4dHVyZXMgYW5kIGRpc3BsYXkgbGlzdHMgYmV0d2VlbiBPcGVu
R0wKICAgIGNvbnRleHRzLCB5b3UgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGUge0BsaW5rICNkaXNw
b3NlIGRpc3Bvc2V9CiAgICBtZXRob2Qgb2YgdGhlIFRleHRSZW5kZXJlcjsgdGhlIE9wZW5HTCBy
ZXNvdXJjZXMgaXQgdXNlcwogICAgaW50ZXJuYWxseSB3aWxsIGJlIGNsZWFuZWQgdXAgYXV0b21h
dGljYWxseSB3aGVuIHRoZSBPcGVuR0wKICAgIGNvbnRleHQgaXMgZGVzdHJveWVkLiA8UD4KCiAg
ICA8Yj5Ob3RlPC9iPiB0aGF0IHRoZSBUZXh0UmVuZGVyZXIgbWF5IGNhdXNlIHRoZSB2ZXJ0ZXgg
YW5kIHRleHR1cmUKICAgIGNvb3JkaW5hdGUgYXJyYXkgYnVmZmVyIGJpbmRpbmdzIHRvIGNoYW5n
ZSwgb3IgdG8gYmUgdW5ib3VuZC4gVGhpcwogICAgaXMgaW1wb3J0YW50IHRvIG5vdGUgaWYgeW91
IGFyZSB1c2luZyBWZXJ0ZXggQnVmZmVyIE9iamVjdHMgKFZCT3MpCiAgICBpbiB5b3VyIGFwcGxp
Y2F0aW9uLiA8UD4KCiAgICBJbnRlcm5hbGx5LCB0aGUgcmVuZGVyZXIgdXNlcyBhIHJlY3Rhbmds
ZSBwYWNraW5nIGFsZ29yaXRobSB0bwogICAgcGFjayBib3RoIGdseXBocyBhbmQgZnVsbCBTdHJp
bmdzJyByZW5kZXJpbmcgcmVzdWx0cyAod2hpY2ggYXJlCiAgICB2YXJpYWJsZSBzaXplKSBvbnRv
IGEgbGFyZ2VyIE9wZW5HTCB0ZXh0dXJlLiBUaGUgaW50ZXJuYWwgYmFja2luZwogICAgc3RvcmUg
aXMgbWFpbnRhaW5lZCB1c2luZyBhIHtAbGluawogICAgY29tLnN1bi5vcGVuZ2wudXRpbC5qMmQu
VGV4dHVyZVJlbmRlcmVyIFRleHR1cmVSZW5kZXJlcn0uIEEgbGVhc3QKICAgIHJlY2VudGx5IHVz
ZWQgKExSVSkgYWxnb3JpdGhtIGlzIHVzZWQgdG8gZGlzY2FyZCBwcmV2aW91c2x5CiAgICByZW5k
ZXJlZCBzdHJpbmdzOyB0aGUgc3BlY2lmaWMgYWxnb3JpdGhtIGlzIHVuZGVmaW5lZCwgYnV0IGlz
CiAgICBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYnkgZmx1c2hpbmcgdW51c2VkIFN0cmluZ3MnIHJl
bmRlcmluZwogICAgcmVzdWx0cyBldmVyeSBmZXcgaHVuZHJlZCByZW5kZXJpbmcgY3ljbGVzLCB3
aGVyZSBhIHJlbmRlcmluZwogICAgY3ljbGUgaXMgZGVmaW5lZCBhcyBhIHBhaXIgb2YgY2FsbHMg
dG8ge0BsaW5rICNiZWdpblJlbmRlcmluZwogICAgYmVnaW5SZW5kZXJpbmd9IC8ge0BsaW5rICNl
bmRSZW5kZXJpbmcgZW5kUmVuZGVyaW5nfS4KCiAgICBAYXV0aG9yIEpvaG4gQnVya2V5CiAgICBA
YXV0aG9yIEtlbm5ldGggUnVzc2VsbAoqLwpwdWJsaWMgY2xhc3MgVGV4dFJlbmRlcmVyIHsKICAg
IHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEZWJ1Zy5kZWJ1ZygiVGV4dFJl
bmRlcmVyIik7CgogICAgLy8gVGhlc2UgYXJlIG9jY2FzaW9uYWxseSB1c2VmdWwgZm9yIG1vcmUg
aW4tZGVwdGggZGVidWdnaW5nCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU0FC
TEVfR0xZUEhfQ0FDSEUgPSBmYWxzZTsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4g
RFJBV19CQk9YRVMgPSBmYWxzZTsKCiAgICBzdGF0aWMgZmluYWwgaW50IGtTaXplID0gMjU2OwoK
ICAgIC8vIEV2ZXJ5IGNlcnRhaW4gbnVtYmVyIG9mIHJlbmRlciBjeWNsZXMsIGZsdXNoIHRoZSBz
dHJpbmdzIHdoaWNoCiAgICAvLyBoYXZlbid0IGJlZW4gdXNlZCByZWNlbnRseQogICAgcHJpdmF0
ZSBzdGF0aWMgZmluYWwgaW50IENZQ0xFU19QRVJfRkxVU0ggPSAxMDA7CgogICAgLy8gVGhlIGFt
b3VudCBvZiB2ZXJ0aWNhbCBkZWFkIHNwYWNlIG9uIHRoZSBiYWNraW5nIHN0b3JlIGJlZm9yZSB3
ZQogICAgLy8gZm9yY2UgYSBjb21wYWN0aW9uCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9h
dCBNQVhfVkVSVElDQUxfRlJBR01FTlRBVElPTiA9IDAuN2Y7CiAgICBzdGF0aWMgZmluYWwgaW50
IGtRdWFkc1BlckJ1ZmZlciA9IDEwMDsKICAgIHN0YXRpYyBmaW5hbCBpbnQga0Nvb3Jkc1BlclZl
cnRWZXJ0cyA9IDM7CiAgICBzdGF0aWMgZmluYWwgaW50IGtDb29yZHNQZXJWZXJ0VGV4ID0gMjsK
ICAgIHN0YXRpYyBmaW5hbCBpbnQga1ZlcnRzUGVyUXVhZCA9IDQ7CiAgICBzdGF0aWMgZmluYWwg
aW50IGtUb3RhbEJ1ZmZlclNpemVWZXJ0cyA9IGtRdWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1
YWQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNWZXJ0cyA9IGtR
dWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1YWQgKiBrQ29vcmRzUGVyVmVydFZlcnRzOwogICAg
c3RhdGljIGZpbmFsIGludCBrVG90YWxCdWZmZXJTaXplQ29vcmRzVGV4ID0ga1F1YWRzUGVyQnVm
ZmVyICoga1ZlcnRzUGVyUXVhZCAqIGtDb29yZHNQZXJWZXJ0VGV4OwogICAgc3RhdGljIGZpbmFs
IGludCBrVG90YWxCdWZmZXJTaXplQnl0ZXNWZXJ0cyA9IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNW
ZXJ0cyAqIDQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVCeXRlc1RleCA9
IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNUZXggKiA0OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6
ZUluQnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSA9IGtDb29yZHNQZXJWZXJ0VmVydHMgKiA0
OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6ZUluQnl0ZXNfT25lVmVydGljZXNfVGV4RGF0YSA9
IGtDb29yZHNQZXJWZXJ0VGV4ICogNDsKICAgIHByaXZhdGUgRm9udCBmb250OwogICAgcHJpdmF0
ZSBib29sZWFuIGFudGlhbGlhc2VkOwogICAgcHJpdmF0ZSBib29sZWFuIHVzZUZyYWN0aW9uYWxN
ZXRyaWNzOwoKICAgIC8vIFdoZXRoZXIgd2UncmUgYXR0ZW1wdGluZyB0byB1c2UgYXV0b21hdGlj
IG1pcG1hcCBnZW5lcmF0aW9uIHN1cHBvcnQKICAgIHByaXZhdGUgYm9vbGVhbiBtaXBtYXA7CiAg
ICBwcml2YXRlIFJlY3RhbmdsZVBhY2tlciBwYWNrZXI7CiAgICBwcml2YXRlIGJvb2xlYW4gaGF2
ZU1heFNpemU7CiAgICBwcml2YXRlIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlOwogICAg
cHJpdmF0ZSBUZXh0dXJlUmVuZGVyZXIgY2FjaGVkQmFja2luZ1N0b3JlOwogICAgcHJpdmF0ZSBH
cmFwaGljczJEIGNhY2hlZEdyYXBoaWNzOwogICAgcHJpdmF0ZSBGb250UmVuZGVyQ29udGV4dCBj
YWNoZWRGb250UmVuZGVyQ29udGV4dDsKICAgIHByaXZhdGUgTWFwIC8qPFN0cmluZyxSZWN0Piov
IHN0cmluZ0xvY2F0aW9ucyA9IG5ldyBIYXNoTWFwIC8qPFN0cmluZyxSZWN0PiovKCk7CiAgICBw
cml2YXRlIEdseXBoUHJvZHVjZXIgbUdseXBoUHJvZHVjZXI7CgogICAgcHJpdmF0ZSBpbnQgbnVt
UmVuZGVyQ3ljbGVzOwoKICAgIC8vIE5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3Jl
IGluIGEgYmVnaW5SZW5kZXJpbmcoKSAvCiAgICAvLyBlbmRSZW5kZXJpbmcoKSBjeWNsZSBzbyB3
ZSBjYW4gcmUtZW50ZXIgdGhlIGV4YWN0IHNhbWUgc3RhdGUgaWYKICAgIC8vIHdlIGhhdmUgdG8g
cmVhbGxvY2F0ZSB0aGUgYmFja2luZyBzdG9yZQogICAgcHJpdmF0ZSBib29sZWFuIGluQmVnaW5F
bmRQYWlyOwogICAgcHJpdmF0ZSBib29sZWFuIGlzT3J0aG9Nb2RlOwogICAgcHJpdmF0ZSBpbnQg
YmVnaW5SZW5kZXJpbmdXaWR0aDsKICAgIHByaXZhdGUgaW50IGJlZ2luUmVuZGVyaW5nSGVpZ2h0
OwogICAgcHJpdmF0ZSBib29sZWFuIGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQ7Cgog
ICAgLy8gRm9yIHJlc2V0dGluZyB0aGUgY29sb3IgYWZ0ZXIgZGlzcG9zYWwgb2YgdGhlIG9sZCBi
YWNraW5nIHN0b3JlCiAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUNhY2hlZENvbG9yOwogICAgcHJp
dmF0ZSBmbG9hdCBjYWNoZWRSOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRHOwogICAgcHJpdmF0
ZSBmbG9hdCBjYWNoZWRCOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRBOwogICAgcHJpdmF0ZSBD
b2xvciBjYWNoZWRDb2xvcjsKICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9SZXNldENvbG9yOwoK
ICAgIC8vIEZvciBkZWJ1Z2dpbmcgb25seQogICAgcHJpdmF0ZSBGcmFtZSBkYmdGcmFtZTsKCiAg
ICAvLyBEZWJ1Z2dpbmcgcHVycG9zZXMgb25seQogICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnZ2Vk
OwogICAgUGlwZWxpbmVkX1F1YWRSZW5kZXJlciBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyOwogICAg
CiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcKICAgIHByaXZhdGUgYm9vbGVhbiB1c2VW
ZXJ0ZXhBcnJheXMgPSB0cnVlOwogICAgCiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcK
ICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dGVuc2lvbkF2YWlsYWJsZV9WQk87CiAgICBwcml2YXRl
IGJvb2xlYW4gY2hlY2tGb3JfaXNFeHRlbnNpb25BdmFpbGFibGVfVkJPOwoKICAgIC8vIFdoZXRo
ZXIgR0xfTElORUFSIGZpbHRlcmluZyBpcyBlbmFibGVkIGZvciB0aGUgYmFja2luZyBzdG9yZQog
ICAgcHJpdmF0ZSBib29sZWFuIHNtb290aGluZyA9IHRydWU7CgogICAgLyoqIENyZWF0ZXMgYSBu
ZXcgVGV4dFJlbmRlcmVyIHdpdGggdGhlIGdpdmVuIGZvbnQsIHVzaW5nIG5vCiAgICAgICAgYW50
aWFsaWFzaW5nIG9yIGZyYWN0aW9uYWwgbWV0cmljcywgYW5kIHRoZSBkZWZhdWx0CiAgICAgICAg
UmVuZGVyRGVsZWdhdGUuIEVxdWl2YWxlbnQgdG8gPGNvZGU+VGV4dFJlbmRlcmVyKGZvbnQsIGZh
bHNlLAogICAgICAgIGZhbHNlKTwvY29kZT4uCgogICAgICAgIEBwYXJhbSBmb250IHRoZSBmb250
IHRvIHJlbmRlciB3aXRoCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQp
IHsKICAgICAgICB0aGlzKGZvbnQsIGZhbHNlLCBmYWxzZSwgbnVsbCwgZmFsc2UpOwogICAgfQoK
ICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRSZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBmb250LCB1
c2luZyBubwogICAgICAgIGFudGlhbGlhc2luZyBvciBmcmFjdGlvbmFsIG1ldHJpY3MsIGFuZCB0
aGUgZGVmYXVsdAogICAgICAgIFJlbmRlckRlbGVnYXRlLiBJZiA8Q09ERT5taXBtYXA8L0NPREU+
IGlzIHRydWUsIGF0dGVtcHRzIHRvIHVzZQogICAgICAgIE9wZW5HTCdzIGF1dG9tYXRpYyBtaXBt
YXAgZ2VuZXJhdGlvbiBmb3IgYmV0dGVyIHNtb290aGluZyB3aGVuCiAgICAgICAgcmVuZGVyaW5n
IHRoZSBUZXh0dXJlUmVuZGVyZXIncyBjb250ZW50cyBhdCBhIGRpc3RhbmNlLgogICAgICAgIEVx
dWl2YWxlbnQgdG8gPGNvZGU+VGV4dFJlbmRlcmVyKGZvbnQsIGZhbHNlLCBmYWxzZSk8L2NvZGU+
LgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0aAogICAgICAgIEBw
YXJhbSBtaXBtYXAgd2hldGhlciB0byBhdHRlbXB0IHVzZSBvZiBhdXRvbWF0aWMgbWlwbWFwIGdl
bmVyYXRpb24KICAgICovCiAgICBwdWJsaWMgVGV4dFJlbmRlcmVyKEZvbnQgZm9udCwgYm9vbGVh
biBtaXBtYXApIHsKICAgICAgICB0aGlzKGZvbnQsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbWlwbWFw
KTsKICAgIH0KCiAgICAvKiogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgd2l0aCB0aGUgZ2l2
ZW4gRm9udCwgc3BlY2lmaWVkIGZvbnQKICAgICAgICBwcm9wZXJ0aWVzLCBhbmQgZGVmYXVsdCBS
ZW5kZXJEZWxlZ2F0ZS4gVGhlCiAgICAgICAgPGNvZGU+YW50aWFsaWFzZWQ8L2NvZGU+IGFuZCA8
Y29kZT51c2VGcmFjdGlvbmFsTWV0cmljczwvY29kZT4KICAgICAgICBmbGFncyBwcm92aWRlIGNv
bnRyb2wgb3ZlciB0aGUgc2FtZSBwcm9wZXJ0aWVzIGF0IHRoZSBKYXZhIDJECiAgICAgICAgbGV2
ZWwuIE5vIG1pcG1hcCBzdXBwb3J0IGlzIHJlcXVlc3RlZC4gRXF1aXZhbGVudCB0bwogICAgICAg
IDxjb2RlPlRleHRSZW5kZXJlcihmb250LCBhbnRpYWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJp
Y3MsCiAgICAgICAgbnVsbCk8L2NvZGU+LgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0
byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJhbSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBh
bnRpYWxpYXNlZCBmb250cwogICAgICAgIEBwYXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0
aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQKICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJE
IGxldmVsCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQsIGJvb2xlYW4g
YW50aWFsaWFzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRnJhY3Rpb25h
bE1ldHJpY3MpIHsKICAgICAgICB0aGlzKGZvbnQsIGFudGlhbGlhc2VkLCB1c2VGcmFjdGlvbmFs
TWV0cmljcywgbnVsbCwgZmFsc2UpOwogICAgfQoKICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRS
ZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBGb250LCBzcGVjaWZpZWQgZm9udAogICAgICAgIHByb3Bl
cnRpZXMsIGFuZCBnaXZlbiBSZW5kZXJEZWxlZ2F0ZS4gVGhlCiAgICAgICAgPGNvZGU+YW50aWFs
aWFzZWQ8L2NvZGU+IGFuZCA8Y29kZT51c2VGcmFjdGlvbmFsTWV0cmljczwvY29kZT4KICAgICAg
ICBmbGFncyBwcm92aWRlIGNvbnRyb2wgb3ZlciB0aGUgc2FtZSBwcm9wZXJ0aWVzIGF0IHRoZSBK
YXZhIDJECiAgICAgICAgbGV2ZWwuIFRoZSA8Y29kZT5yZW5kZXJEZWxlZ2F0ZTwvY29kZT4gcHJv
dmlkZXMgbW9yZSBjb250cm9sCiAgICAgICAgb3ZlciB0aGUgdGV4dCByZW5kZXJlZC4gTm8gbWlw
bWFwIHN1cHBvcnQgaXMgcmVxdWVzdGVkLgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0
byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJhbSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBh
bnRpYWxpYXNlZCBmb250cwogICAgICAgIEBwYXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0
aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQKICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJE
IGxldmVsCiAgICAgICAgQHBhcmFtIHJlbmRlckRlbGVnYXRlIHRoZSByZW5kZXIgZGVsZWdhdGUg
dG8gdXNlIHRvIGRyYXcgdGhlCiAgICAgICAgdGV4dCdzIGJpdG1hcCwgb3IgbnVsbCB0byB1c2Ug
dGhlIGRlZmF1bHQgb25lCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQs
IGJvb2xlYW4gYW50aWFsaWFzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNl
RnJhY3Rpb25hbE1ldHJpY3MsIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlKSB7CiAgICAg
ICAgdGhpcyhmb250LCBhbnRpYWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJpY3MsIHJlbmRlckRl
bGVnYXRlLCBmYWxzZSk7CiAgICB9CgogICAgLyoqIENyZWF0ZXMgYSBuZXcgVGV4dFJlbmRlcmVy
IHdpdGggdGhlIGdpdmVuIEZvbnQsIHNwZWNpZmllZCBmb250CiAgICAgICAgcHJvcGVydGllcywg
YW5kIGdpdmVuIFJlbmRlckRlbGVnYXRlLiBUaGUKICAgICAgICA8Y29kZT5hbnRpYWxpYXNlZDwv
Y29kZT4gYW5kIDxjb2RlPnVzZUZyYWN0aW9uYWxNZXRyaWNzPC9jb2RlPgogICAgICAgIGZsYWdz
IHByb3ZpZGUgY29udHJvbCBvdmVyIHRoZSBzYW1lIHByb3BlcnRpZXMgYXQgdGhlIEphdmEgMkQK
ICAgICAgICBsZXZlbC4gVGhlIDxjb2RlPnJlbmRlckRlbGVnYXRlPC9jb2RlPiBwcm92aWRlcyBt
b3JlIGNvbnRyb2wKICAgICAgICBvdmVyIHRoZSB0ZXh0IHJlbmRlcmVkLiBJZiA8Q09ERT5taXBt
YXA8L0NPREU+IGlzIHRydWUsIGF0dGVtcHRzCiAgICAgICAgdG8gdXNlIE9wZW5HTCdzIGF1dG9t
YXRpYyBtaXBtYXAgZ2VuZXJhdGlvbiBmb3IgYmV0dGVyIHNtb290aGluZwogICAgICAgIHdoZW4g
cmVuZGVyaW5nIHRoZSBUZXh0dXJlUmVuZGVyZXIncyBjb250ZW50cyBhdCBhIGRpc3RhbmNlLgoK
ICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJh
bSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBhbnRpYWxpYXNlZCBmb250cwogICAgICAgIEBw
YXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQK
ICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJEIGxldmVsCiAgICAgICAgQHBhcmFtIHJlbmRl
ckRlbGVnYXRlIHRoZSByZW5kZXIgZGVsZWdhdGUgdG8gdXNlIHRvIGRyYXcgdGhlCiAgICAgICAg
dGV4dCdzIGJpdG1hcCwgb3IgbnVsbCB0byB1c2UgdGhlIGRlZmF1bHQgb25lCiAgICAgICAgQHBh
cmFtIG1pcG1hcCB3aGV0aGVyIHRvIGF0dGVtcHQgdXNlIG9mIGF1dG9tYXRpYyBtaXBtYXAgZ2Vu
ZXJhdGlvbgogICAgKi8KICAgIHB1YmxpYyBUZXh0UmVuZGVyZXIoRm9udCBmb250LCBib29sZWFu
IGFudGlhbGlhc2VkLAogICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUZyYWN0aW9u
YWxNZXRyaWNzLCBSZW5kZXJEZWxlZ2F0ZSByZW5kZXJEZWxlZ2F0ZSwKICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vbGVhbiBtaXBtYXApIHsKICAgICAgICB0aGlzLmZvbnQgPSBmb250OwogICAg
ICAgIHRoaXMuYW50aWFsaWFzZWQgPSBhbnRpYWxpYXNlZDsKICAgICAgICB0aGlzLnVzZUZyYWN0
aW9uYWxNZXRyaWNzID0gdXNlRnJhY3Rpb25hbE1ldHJpY3M7CiAgICAgICAgdGhpcy5taXBtYXAg
PSBtaXBtYXA7CgogICAgICAgIC8vIEZJWE1FOiBjb25zaWRlciBhZGp1c3RpbmcgdGhlIHNpemUg
YmFzZWQgb24gZm9udCBzaXplCiAgICAgICAgLy8gKGl0IHdpbGwgYWxyZWFkeSBhdXRvbWF0aWNh
bGx5IHJlc2l6ZSBpZiBuZWNlc3NhcnkpCiAgICAgICAgcGFja2VyID0gbmV3IFJlY3RhbmdsZVBh
Y2tlcihuZXcgTWFuYWdlcigpLCBrU2l6ZSwga1NpemUpOwoKICAgICAgICBpZiAocmVuZGVyRGVs
ZWdhdGUgPT0gbnVsbCkgewogICAgICAgICAgICByZW5kZXJEZWxlZ2F0ZSA9IG5ldyBEZWZhdWx0
UmVuZGVyRGVsZWdhdGUoKTsKICAgICAgICB9CgogICAgICAgIHRoaXMucmVuZGVyRGVsZWdhdGUg
PSByZW5kZXJEZWxlZ2F0ZTsKCiAgICAgICAgbUdseXBoUHJvZHVjZXIgPSBuZXcgR2x5cGhQcm9k
dWNlcihmb250LmdldE51bUdseXBocygpKTsKICAgIH0KCiAgICAvKiogUmV0dXJucyB0aGUgYm91
bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBnaXZlbiBTdHJpbmcsIGFzc3VtaW5nIGl0CiAgICAgICAg
d2FzIHJlbmRlcmVkIGF0IHRoZSBvcmlnaW4uIFNlZSB7QGxpbmsgI2dldEJvdW5kcyhDaGFyU2Vx
dWVuY2UpCiAgICAgICAgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSl9LiAqLwogICAgcHVibGljIFJl
Y3RhbmdsZTJEIGdldEJvdW5kcyhTdHJpbmcgc3RyKSB7CiAgICAgICAgcmV0dXJuIGdldEJvdW5k
cygoQ2hhclNlcXVlbmNlKSBzdHIpOwogICAgfQoKICAgIC8qKiBSZXR1cm5zIHRoZSBib3VuZGlu
ZyByZWN0YW5nbGUgb2YgdGhlIGdpdmVuIENoYXJTZXF1ZW5jZSwKICAgICAgICBhc3N1bWluZyBp
dCB3YXMgcmVuZGVyZWQgYXQgdGhlIG9yaWdpbi4gVGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mCiAg
ICAgICAgdGhlIHJldHVybmVkIHJlY3RhbmdsZSBpcyBKYXZhIDJEJ3MsIHdpdGggaW5jcmVhc2lu
ZyBZCiAgICAgICAgY29vcmRpbmF0ZXMgaW4gdGhlIGRvd253YXJkIGRpcmVjdGlvbi4gVGhlIHJl
bGF0aXZlIGNvb3JkaW5hdGUKICAgICAgICAoMCwgMCkgaW4gdGhlIHJldHVybmVkIHJlY3Rhbmds
ZSBjb3JyZXNwb25kcyB0byB0aGUgYmFzZWxpbmUgb2YKICAgICAgICB0aGUgbGVmdG1vc3QgY2hh
cmFjdGVyIG9mIHRoZSByZW5kZXJlZCBzdHJpbmcsIGluIHNpbWlsYXIKICAgICAgICBmYXNoaW9u
IHRvIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5LCBmb3IgZXhhbXBsZSwge0BsaW5rCiAgICAgICAg
amF2YS5hd3QuZm9udC5HbHlwaFZlY3RvciNnZXRWaXN1YWxCb3VuZHN9LiBNb3N0IGFwcGxpY2F0
aW9ucwogICAgICAgIHdpbGwgdXNlIG9ubHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHJl
dHVybmVkIFJlY3RhbmdsZSBmb3IKICAgICAgICB0aGUgcHVycG9zZXMgb2YgY2VudGVyaW5nIG9y
IGp1c3RpZnlpbmcgdGhlIFN0cmluZy4gSXQgaXMgbm90CiAgICAgICAgc3BlY2lmaWVkIHdoaWNo
IEphdmEgMkQgYm91bmRzICh7QGxpbmsKICAgICAgICBqYXZhLmF3dC5mb250LkdseXBoVmVjdG9y
I2dldFZpc3VhbEJvdW5kcyBnZXRWaXN1YWxCb3VuZHN9LAogICAgICAgIHtAbGluayBqYXZhLmF3
dC5mb250LkdseXBoVmVjdG9yI2dldFBpeGVsQm91bmRzIGdldFBpeGVsQm91bmRzfSwKICAgICAg
ICBldGMuKSB0aGUgcmV0dXJuZWQgYm91bmRzIGNvcnJlc3BvbmQgdG8sIGFsdGhvdWdoIGV2ZXJ5
IGVmZm9ydAogICAgICAgIGlzIG1hZGUgdG8gZW5zdXJlIGFuIGFjY3VyYXRlIGJvdW5kLiAqLwog
ICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kcyhDaGFyU2VxdWVuY2Ugc3RyKSB7CiAgICAg
ICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIG1vcmUgb3B0aW1pemVkIGFuZCB1c2UgdGhlIGds
eXBoIGNhY2hlCiAgICAgICAgUmVjdCByID0gbnVsbDsKCiAgICAgICAgaWYgKChyID0gKFJlY3Qp
IHN0cmluZ0xvY2F0aW9ucy5nZXQoc3RyKSkgIT0gbnVsbCkgewogICAgICAgICAgICBUZXh0RGF0
YSBkYXRhID0gKFRleHREYXRhKSByLmdldFVzZXJEYXRhKCk7CgogICAgICAgICAgICAvLyBSZWNv
bnN0aXR1dGUgdGhlIEphdmEgMkQgcmVzdWx0cyBiYXNlZCBvbiB0aGUgY2FjaGVkIHZhbHVlcwog
ICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZTJELkRvdWJsZSgtZGF0YS5vcmlnaW4oKS54
LCAtZGF0YS5vcmlnaW4oKS55LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByLncoKSwgci5oKCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gTXVzdCByZXR1cm4gYSBS
ZWN0YW5nbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBsYXlvdXQgYWxnb3JpdGhtIC0tCiAgICAgICAg
Ly8gbXVzdCBiZSBpZGVtcG90ZW50CiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShyZW5kZXJEZWxl
Z2F0ZS5nZXRCb3VuZHMoc3RyLCBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGdldEZvbnRSZW5kZXJDb250ZXh0KCkpKTsKICAgIH0KCiAgICAv
KiogUmV0dXJucyB0aGUgRm9udCB0aGlzIHJlbmRlcmVyIGlzIHVzaW5nLiAqLwogICAgcHVibGlj
IEZvbnQgZ2V0Rm9udCgpIHsKICAgICAgICByZXR1cm4gZm9udDsKICAgIH0KCiAgICAvKiogUmV0
dXJucyBhIEZvbnRSZW5kZXJDb250ZXh0IHdoaWNoIGNhbiBiZSB1c2VkIGZvciBleHRlcm5hbAog
ICAgICAgIHRleHQtcmVsYXRlZCBzaXplIGNvbXB1dGF0aW9ucy4gVGhpcyBvYmplY3Qgc2hvdWxk
IGJlIGNvbnNpZGVyZWQKICAgICAgICB0cmFuc2llbnQgYW5kIG1heSBiZWNvbWUgaW52YWxpZGF0
ZWQgYmV0d2VlbiB7QGxpbmsKICAgICAgICAjYmVnaW5SZW5kZXJpbmcgYmVnaW5SZW5kZXJpbmd9
IC8ge0BsaW5rICNlbmRSZW5kZXJpbmcKICAgICAgICBlbmRSZW5kZXJpbmd9IHBhaXJzLiAqLwog
ICAgcHVibGljIEZvbnRSZW5kZXJDb250ZXh0IGdldEZvbnRSZW5kZXJDb250ZXh0KCkgewogICAg
ICAgIGlmIChjYWNoZWRGb250UmVuZGVyQ29udGV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgIGNh
Y2hlZEZvbnRSZW5kZXJDb250ZXh0ID0gZ2V0R3JhcGhpY3MyRCgpLmdldEZvbnRSZW5kZXJDb250
ZXh0KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2FjaGVkRm9udFJlbmRlckNvbnRleHQ7
CiAgICB9CgogICAgLyoqIEJlZ2lucyByZW5kZXJpbmcgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVu
ZGVyZXIgVGV4dFJlbmRlcmVyfQogICAgICAgIGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdh
YmxlLCBwdXNoaW5nIHRoZSBwcm9qZWN0aW9uIGFuZAogICAgICAgIG1vZGVsdmlldyBtYXRyaWNl
cyBhbmQgc29tZSBzdGF0ZSBiaXRzIGFuZCBzZXR0aW5nIHVwIGEKICAgICAgICB0d28tZGltZW5z
aW9uYWwgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gd2l0aCAoMCwgMCkgYXMgdGhlCiAgICAgICAg
bG93ZXItbGVmdCBjb29yZGluYXRlIGFuZCAod2lkdGgsIGhlaWdodCkgYXMgdGhlIHVwcGVyLXJp
Z2h0CiAgICAgICAgY29vcmRpbmF0ZS4gQmluZHMgYW5kIGVuYWJsZXMgdGhlIGludGVybmFsIE9w
ZW5HTCB0ZXh0dXJlCiAgICAgICAgb2JqZWN0LCBzZXRzIHRoZSB0ZXh0dXJlIGVudmlyb25tZW50
IG1vZGUgdG8gR0xfTU9EVUxBVEUsIGFuZAogICAgICAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgY29s
b3IgdG8gdGhlIGxhc3QgY29sb3Igc2V0IHdpdGggdGhpcwogICAgICAgIFRleHRSZW5kZXJlciB2
aWEge0BsaW5rICNzZXRDb2xvciBzZXRDb2xvcn0uIFRoaXMgbWV0aG9kCiAgICAgICAgZGlzYWJs
ZXMgdGhlIGRlcHRoIHRlc3QgYW5kIGlzIGVxdWl2YWxlbnQgdG8KICAgICAgICBiZWdpblJlbmRl
cmluZyh3aWR0aCwgaGVpZ2h0LCB0cnVlKS4KCiAgICAgICAgQHBhcmFtIHdpZHRoIHRoZSB3aWR0
aCBvZiB0aGUgY3VycmVudCBvbi1zY3JlZW4gT3BlbkdMIGRyYXdhYmxlCiAgICAgICAgQHBhcmFt
IGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBjdXJyZW50IG9uLXNjcmVlbiBPcGVuR0wgZHJhd2Fi
bGUKICAgICAgICBAdGhyb3dzIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV4Y2VwdGlvbiBJZiBhbiBP
cGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAog
ICAgKi8KICAgIHB1YmxpYyB2b2lkIGJlZ2luUmVuZGVyaW5nKGludCB3aWR0aCwgaW50IGhlaWdo
dCkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBiZWdpblJlbmRlcmluZyh3aWR0aCwgaGVp
Z2h0LCB0cnVlKTsKICAgIH0KCiAgICAvKiogQmVnaW5zIHJlbmRlcmluZyB3aXRoIHRoaXMge0Bs
aW5rIFRleHRSZW5kZXJlciBUZXh0UmVuZGVyZXJ9CiAgICAgICAgaW50byB0aGUgY3VycmVudCBP
cGVuR0wgZHJhd2FibGUsIHB1c2hpbmcgdGhlIHByb2plY3Rpb24gYW5kCiAgICAgICAgbW9kZWx2
aWV3IG1hdHJpY2VzIGFuZCBzb21lIHN0YXRlIGJpdHMgYW5kIHNldHRpbmcgdXAgYQogICAgICAg
IHR3by1kaW1lbnNpb25hbCBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiB3aXRoICgwLCAwKSBhcyB0
aGUKICAgICAgICBsb3dlci1sZWZ0IGNvb3JkaW5hdGUgYW5kICh3aWR0aCwgaGVpZ2h0KSBhcyB0
aGUgdXBwZXItcmlnaHQKICAgICAgICBjb29yZGluYXRlLiBCaW5kcyBhbmQgZW5hYmxlcyB0aGUg
aW50ZXJuYWwgT3BlbkdMIHRleHR1cmUKICAgICAgICBvYmplY3QsIHNldHMgdGhlIHRleHR1cmUg
ZW52aXJvbm1lbnQgbW9kZSB0byBHTF9NT0RVTEFURSwgYW5kCiAgICAgICAgY2hhbmdlcyB0aGUg
Y3VycmVudCBjb2xvciB0byB0aGUgbGFzdCBjb2xvciBzZXQgd2l0aCB0aGlzCiAgICAgICAgVGV4
dFJlbmRlcmVyIHZpYSB7QGxpbmsgI3NldENvbG9yIHNldENvbG9yfS4gRGlzYWJsZXMgdGhlIGRl
cHRoCiAgICAgICAgdGVzdCBpZiB0aGUgZGlzYWJsZURlcHRoVGVzdCBhcmd1bWVudCBpcyB0cnVl
LgoKICAgICAgICBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBjdXJyZW50IG9uLXNjcmVl
biBPcGVuR0wgZHJhd2FibGUKICAgICAgICBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhl
IGN1cnJlbnQgb24tc2NyZWVuIE9wZW5HTCBkcmF3YWJsZQogICAgICAgIEBwYXJhbSBkaXNhYmxl
RGVwdGhUZXN0IHdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgZGVwdGggdGVzdAogICAgICAgIEB0aHJv
d3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBiZWdpblJlbmRlcmlu
ZyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gZGlzYWJsZURlcHRoVGVzdCkKICAgICAg
ICB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGJlZ2luUmVuZGVyaW5nKHRydWUsIHdpZHRo
LCBoZWlnaHQsIGRpc2FibGVEZXB0aFRlc3QpOwogICAgfQoKICAgIC8qKiBCZWdpbnMgcmVuZGVy
aW5nIG9mIDJEIHRleHQgaW4gM0Qgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIKICAgICAg
ICBUZXh0UmVuZGVyZXJ9IGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdhYmxlLiBBc3N1bWVz
IHRoZSBlbmQKICAgICAgICB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHVwIHRoZSBt
b2RlbHZpZXcgYW5kIHByb2plY3Rpb24KICAgICAgICBtYXRyaWNlcywgYW5kIHdpbGwgcmVuZGVy
IHRleHQgdXNpbmcgdGhlIHtAbGluayAjZHJhdzNEIGRyYXczRH0KICAgICAgICBtZXRob2QuIFRo
aXMgbWV0aG9kIHB1c2hlcyBzb21lIE9wZW5HTCBzdGF0ZSBiaXRzLCBiaW5kcyBhbmQKICAgICAg
ICBlbmFibGVzIHRoZSBpbnRlcm5hbCBPcGVuR0wgdGV4dHVyZSBvYmplY3QsIHNldHMgdGhlIHRl
eHR1cmUKICAgICAgICBlbnZpcm9ubWVudCBtb2RlIHRvIEdMX01PRFVMQVRFLCBhbmQgY2hhbmdl
cyB0aGUgY3VycmVudCBjb2xvcgogICAgICAgIHRvIHRoZSBsYXN0IGNvbG9yIHNldCB3aXRoIHRo
aXMgVGV4dFJlbmRlcmVyIHZpYSB7QGxpbmsKICAgICAgICAjc2V0Q29sb3Igc2V0Q29sb3J9LgoK
ICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBj
dXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQg
YmVnaW4zRFJlbmRlcmluZygpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgYmVnaW5SZW5k
ZXJpbmcoZmFsc2UsIDAsIDAsIGZhbHNlKTsKICAgIH0KCiAgICAvKiogQ2hhbmdlcyB0aGUgY3Vy
cmVudCBjb2xvciBvZiB0aGlzIFRleHRSZW5kZXJlciB0byB0aGUgc3VwcGxpZWQKICAgICAgICBv
bmUuIFRoZSBkZWZhdWx0IGNvbG9yIGlzIG9wYXF1ZSB3aGl0ZS4KCiAgICAgICAgQHBhcmFtIGNv
bG9yIHRoZSBuZXcgY29sb3IgdG8gdXNlIGZvciByZW5kZXJpbmcgdGV4dAogICAgICAgIEB0aHJv
d3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihDb2xv
ciBjb2xvcikgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBib29sZWFuIG5vTmVlZEZvckZs
dXNoID0gKGhhdmVDYWNoZWRDb2xvciAmJiAoY2FjaGVkQ29sb3IgIT0gbnVsbCkgJiYKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLmVxdWFscyhjYWNoZWRDb2xvcikpOwoK
ICAgICAgICBpZiAoIW5vTmVlZEZvckZsdXNoKSB7CiAgICAgICAgICAgIGZsdXNoR2x5cGhQaXBl
bGluZSgpOwogICAgICAgIH0KCiAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuc2V0Q29sb3IoY29s
b3IpOwogICAgICAgIGhhdmVDYWNoZWRDb2xvciA9IHRydWU7CiAgICAgICAgY2FjaGVkQ29sb3Ig
PSBjb2xvcjsKICAgIH0KCiAgICAvKiogQ2hhbmdlcyB0aGUgY3VycmVudCBjb2xvciBvZiB0aGlz
IFRleHRSZW5kZXJlciB0byB0aGUgc3VwcGxpZWQKICAgICAgICBvbmUsIHdoZXJlIGVhY2ggY29t
cG9uZW50IHJhbmdlcyBmcm9tIDAuMGYgLSAxLjBmLiBUaGUgYWxwaGEKICAgICAgICBjb21wb25l
bnQsIGlmIHVzZWQsIGRvZXMgbm90IG5lZWQgdG8gYmUgcHJlbXVsdGlwbGllZCBpbnRvIHRoZQog
ICAgICAgIGNvbG9yIGNoYW5uZWxzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBm
b3Ige0BsaW5rCiAgICAgICAgY29tLnN1bi5vcGVuZ2wudXRpbC50ZXh0dXJlLlRleHR1cmUgVGV4
dHVyZX0sIGFsdGhvdWdoCiAgICAgICAgcHJlbXVsdGlwbGllZCBjb2xvcnMgYXJlIHVzZWQgaW50
ZXJuYWxseS4gVGhlIGRlZmF1bHQgY29sb3IgaXMKICAgICAgICBvcGFxdWUgd2hpdGUuCgogICAg
ICAgIEBwYXJhbSByIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3IKICAgICAgICBA
cGFyYW0gZyB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3IKICAgICAgICBAcGFy
YW0gYiB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIG5ldyBjb2xvcgogICAgICAgIEBwYXJhbSBh
IHRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIG5ldyBjb2xvciwgMC4wZiA9IGNvbXBsZXRlbHkK
ICAgICAgICB0cmFuc3BhcmVudCwgMS4wZiA9IGNvbXBsZXRlbHkgb3BhcXVlCiAgICAgICAgQHRo
cm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVu
IHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZs
b2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCiAgICAgICAgdGhyb3dzIEdMRXhjZXB0
aW9uIHsKICAgICAgICBib29sZWFuIG5vTmVlZEZvckZsdXNoID0gKGhhdmVDYWNoZWRDb2xvciAm
JiAoY2FjaGVkQ29sb3IgPT0gbnVsbCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChyID09IGNhY2hlZFIpICYmIChnID09IGNhY2hlZEcpICYmIChiID09IGNhY2hlZEIpICYm
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSA9PSBjYWNoZWRBKSk7CgogICAg
ICAgIGlmICghbm9OZWVkRm9yRmx1c2gpIHsKICAgICAgICAgICAgZmx1c2hHbHlwaFBpcGVsaW5l
KCk7CiAgICAgICAgfQoKICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xvcihyLCBnLCBi
LCBhKTsKICAgICAgICBoYXZlQ2FjaGVkQ29sb3IgPSB0cnVlOwogICAgICAgIGNhY2hlZFIgPSBy
OwogICAgICAgIGNhY2hlZEcgPSBnOwogICAgICAgIGNhY2hlZEIgPSBiOwogICAgICAgIGNhY2hl
ZEEgPSBhOwogICAgICAgIGNhY2hlZENvbG9yID0gbnVsbDsKICAgIH0KCiAgICAvKiogRHJhd3Mg
dGhlIHN1cHBsaWVkIENoYXJTZXF1ZW5jZSBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiB1c2luZwog
ICAgICAgIHRoZSByZW5kZXJlcidzIGN1cnJlbnQgY29sb3IuIFRoZSBiYXNlbGluZSBvZiB0aGUg
bGVmdG1vc3QKICAgICAgICBjaGFyYWN0ZXIgaXMgYXQgcG9zaXRpb24gKHgsIHkpIHNwZWNpZmll
ZCBpbiBPcGVuR0wgY29vcmRpbmF0ZXMsCiAgICAgICAgd2hlcmUgdGhlIG9yaWdpbiBpcyBhdCB0
aGUgbG93ZXItbGVmdCBvZiB0aGUgZHJhd2FibGUgYW5kIHRoZSBZCiAgICAgICAgY29vcmRpbmF0
ZSBpbmNyZWFzZXMgaW4gdGhlIHVwd2FyZCBkaXJlY3Rpb24uCgogICAgICAgIEBwYXJhbSBzdHIg
dGhlIHN0cmluZyB0byBkcmF3CiAgICAgICAgQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBhdCB3
aGljaCB0byBkcmF3CiAgICAgICAgQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBhdCB3aGljaCB0
byBkcmF3CiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBp
cyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1Ymxp
YyB2b2lkIGRyYXcoQ2hhclNlcXVlbmNlIHN0ciwgaW50IHgsIGludCB5KSB0aHJvd3MgR0xFeGNl
cHRpb24gewogICAgICAgIGRyYXczRChzdHIsIHgsIHksIDAsIDEpOwogICAgfQoKICAgIC8qKiBE
cmF3cyB0aGUgc3VwcGxpZWQgU3RyaW5nIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIHVzaW5nIHRo
ZQogICAgICAgIHJlbmRlcmVyJ3MgY3VycmVudCBjb2xvci4gU2VlIHtAbGluayAjZHJhdyhDaGFy
U2VxdWVuY2UsIGludCwKICAgICAgICBpbnQpIGRyYXcoQ2hhclNlcXVlbmNlLCBpbnQsIGludCl9
LiAqLwogICAgcHVibGljIHZvaWQgZHJhdyhTdHJpbmcgc3RyLCBpbnQgeCwgaW50IHkpIHRocm93
cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgZHJhdzNEKHN0ciwgeCwgeSwgMCwgMSk7CiAgICB9Cgog
ICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBDaGFyU2VxdWVuY2UgYXQgdGhlIGRlc2lyZWQgM0Qg
bG9jYXRpb24gdXNpbmcKICAgICAgICB0aGUgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9yLiBUaGUg
YmFzZWxpbmUgb2YgdGhlIGxlZnRtb3N0CiAgICAgICAgY2hhcmFjdGVyIGlzIHBsYWNlZCBhdCBw
b3NpdGlvbiAoeCwgeSwgeikgaW4gdGhlIGN1cnJlbnQKICAgICAgICBjb29yZGluYXRlIHN5c3Rl
bS4KCiAgICAgICAgQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGRyYXcKICAgICAgICBAcGFyYW0g
eCB0aGUgeCBjb29yZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0geSB0aGUg
eSBjb29yZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0geiB0aGUgeiBjb29y
ZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0gc2NhbGVGYWN0b3IgYSB1bmlm
b3JtIHNjYWxlIGZhY3RvciBhcHBsaWVkIHRvIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBk
cmF3biByZWN0YW5nbGUKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBj
b250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwog
ICAgcHVibGljIHZvaWQgZHJhdzNEKENoYXJTZXF1ZW5jZSBzdHIsIGZsb2F0IHgsIGZsb2F0IHks
IGZsb2F0IHosCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAg
ICAgICBpbnRlcm5hbF9kcmF3M0Qoc3RyLCB4LCB5LCB6LCBzY2FsZUZhY3Rvcik7CiAgICB9Cgog
ICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBTdHJpbmcgYXQgdGhlIGRlc2lyZWQgM0QgbG9jYXRp
b24gdXNpbmcgdGhlCiAgICAgICAgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9yLiBTZWUge0BsaW5r
ICNkcmF3M0QoQ2hhclNlcXVlbmNlLAogICAgICAgIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0
KSBkcmF3M0QoQ2hhclNlcXVlbmNlLCBmbG9hdCwgZmxvYXQsCiAgICAgICAgZmxvYXQsIGZsb2F0
KX0uICovCiAgICBwdWJsaWMgdm9pZCBkcmF3M0QoU3RyaW5nIHN0ciwgZmxvYXQgeCwgZmxvYXQg
eSwgZmxvYXQgeiwgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAgICAgICBpbnRlcm5hbF9kcmF3M0Qo
c3RyLCB4LCB5LCB6LCBzY2FsZUZhY3Rvcik7CiAgICB9CgogICAgLyoqIFJldHVybnMgdGhlIHBp
eGVsIHdpZHRoIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIuICovCiAgICBwdWJsaWMgZmxvYXQgZ2V0
Q2hhcldpZHRoKGNoYXIgaW5DaGFyKSB7CiAgICAgICAgcmV0dXJuIG1HbHlwaFByb2R1Y2VyLmdl
dEdseXBoUGl4ZWxXaWR0aChpbkNoYXIpOwogICAgfQoKICAgIC8qKiBDYXVzZXMgdGhlIFRleHRS
ZW5kZXJlciB0byBmbHVzaCBhbnkgaW50ZXJuYWwgY2FjaGVzIGl0IG1heSBiZQogICAgICAgIG1h
aW50YWluaW5nIGFuZCBkcmF3IGl0cyByZW5kZXJpbmcgcmVzdWx0cyB0byB0aGUgc2NyZWVuLiBU
aGlzCiAgICAgICAgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBlYWNoIGNhbGwgdG8gZHJhdygpIGlm
IHlvdSBhcmUgc2V0dGluZwogICAgICAgIE9wZW5HTCBzdGF0ZSBzdWNoIGFzIHRoZSBtb2RlbHZp
ZXcgbWF0cml4IGJldHdlZW4gY2FsbHMgdG8KICAgICAgICBkcmF3KCkuICovCiAgICBwdWJsaWMg
dm9pZCBmbHVzaCgpIHsKICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUoKTsKICAgIH0KCiAgICAv
KiogRW5kcyBhIHJlbmRlciBjeWNsZSB3aXRoIHRoaXMge0BsaW5rIFRleHRSZW5kZXJlciBUZXh0
UmVuZGVyZXJ9LgogICAgICAgIFJlc3RvcmVzIHRoZSBwcm9qZWN0aW9uIGFuZCBtb2RlbHZpZXcg
bWF0cmljZXMgYXMgd2VsbCBhcwogICAgICAgIHNldmVyYWwgT3BlbkdMIHN0YXRlIGJpdHMuIFNo
b3VsZCBiZSBwYWlyZWQgd2l0aCB7QGxpbmsKICAgICAgICAjYmVnaW5SZW5kZXJpbmcgYmVnaW5S
ZW5kZXJpbmd9LgoKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250
ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAg
cHVibGljIHZvaWQgZW5kUmVuZGVyaW5nKCkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBl
bmRSZW5kZXJpbmcodHJ1ZSk7CiAgICB9CgogICAgLyoqIEVuZHMgYSAzRCByZW5kZXIgY3ljbGUg
d2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIgVGV4dFJlbmRlcmVyfS4KICAgICAgICBSZXN0
b3JlcyBzZXZlcmFsIE9wZW5HTCBzdGF0ZSBiaXRzLiBTaG91bGQgYmUgcGFpcmVkIHdpdGgge0Bs
aW5rCiAgICAgICAgI2JlZ2luM0RSZW5kZXJpbmcgYmVnaW4zRFJlbmRlcmluZ30uCgogICAgICAg
IEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQg
d2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBlbmQzRFJl
bmRlcmluZygpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgZW5kUmVuZGVyaW5nKGZhbHNl
KTsKICAgIH0KCiAgICAvKiogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyB0aGlzIFRleHRSZW5k
ZXJlciBpcyB1c2luZy4gSXQgaXMgbm90CiAgICAgICAgdmFsaWQgdG8gdXNlIHRoZSBUZXh0UmVu
ZGVyZXIgYWZ0ZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgoKICAgICAgICBAdGhyb3dzIEdMRXhj
ZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRo
b2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHRocm93cyBHTEV4
Y2VwdGlvbiB7CiAgICAgICAgcGFja2VyLmRpc3Bvc2UoKTsKICAgICAgICBwYWNrZXIgPSBudWxs
OwogICAgICAgIGNhY2hlZEJhY2tpbmdTdG9yZSA9IG51bGw7CiAgICAgICAgY2FjaGVkR3JhcGhp
Y3MgPSBudWxsOwogICAgICAgIGNhY2hlZEZvbnRSZW5kZXJDb250ZXh0ID0gbnVsbDsKCiAgICAg
ICAgaWYgKGRiZ0ZyYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgZGJnRnJhbWUuZGlzcG9zZSgp
OwogICAgICAgIH0KICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEludGVybmFscyBv
bmx5IGJlbG93IHRoaXMgcG9pbnQKICAgIC8vCgogICAgcHJpdmF0ZSBzdGF0aWMgUmVjdGFuZ2xl
MkQgcHJlTm9ybWFsaXplKFJlY3RhbmdsZTJEIHNyYykgewogICAgICAgIC8vIE5lZWQgdG8gcm91
bmQgdG8gaW50ZWdlciBjb29yZGluYXRlcwogICAgICAgIC8vIEFsc28gZ2l2ZSBvdXJzZWx2ZXMg
YSBsaXR0bGUgc2xvcCBhcm91bmQgdGhlIHJlcG9ydGVkCiAgICAgICAgLy8gYm91bmRzIG9mIGds
eXBocyBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgbmVpdGhlciB0aGUgdmlzdWFsCiAgICAgICAgLy8g
bm9yIHRoZSBwaXhlbCBib3VuZHMgd29ya3MgcGVyZmVjdGx5IHdlbGwKICAgICAgICBpbnQgbWlu
WCA9IChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblgoKSkgLSAxOwogICAgICAgIGludCBtaW5Z
ID0gKGludCkgTWF0aC5mbG9vcihzcmMuZ2V0TWluWSgpKSAtIDE7CiAgICAgICAgaW50IG1heFgg
PSAoaW50KSBNYXRoLmNlaWwoc3JjLmdldE1heFgoKSkgKyAxOwogICAgICAgIGludCBtYXhZID0g
KGludCkgTWF0aC5jZWlsKHNyYy5nZXRNYXhZKCkpICsgMTsKICAgICAgICByZXR1cm4gbmV3IFJl
Y3RhbmdsZTJELkRvdWJsZShtaW5YLCBtaW5ZLCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpOwog
ICAgfQoKCiAgICBwcml2YXRlIFJlY3RhbmdsZTJEIG5vcm1hbGl6ZShSZWN0YW5nbGUyRCBzcmMp
IHsKICAgICAgICAvLyBHaXZlIG91cnNlbHZlcyBhIGJvdW5kYXJ5IGFyb3VuZCBlYWNoIGVudGl0
eSBvbiB0aGUgYmFja2luZwogICAgICAgIC8vIHN0b3JlIGluIG9yZGVyIHRvIHByZXZlbnQgYmxl
ZWRpbmcgb2YgbmVhcmJ5IFN0cmluZ3MgZHVlIHRvCiAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3
ZSB1c2UgbGluZWFyIGZpbHRlcmluZwoKICAgICAgICAvLyBOT1RFIHRoYXQgdGhpcyBib3VuZGFy
eSBpcyBxdWl0ZSBoZXVyaXN0aWMgYW5kIGlzIHJlbGF0ZWQKICAgICAgICAvLyB0byBob3cgZmFy
IGF3YXkgaW4gM0Qgd2UgbWF5IHZpZXcgdGhlIHRleHQgLS0KICAgICAgICAvLyBoZXVyaXN0aWNh
bGx5LCAxLjUlIG9mIHRoZSBmb250J3MgaGVpZ2h0CiAgICAgICAgaW50IGJvdW5kYXJ5ID0gKGlu
dCkgTWF0aC5tYXgoMSwgMC4wMTUgKiBmb250LmdldFNpemUoKSk7CgogICAgICAgIHJldHVybiBu
ZXcgUmVjdGFuZ2xlMkQuRG91YmxlKChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblgoKSAtIGJv
dW5kYXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRo
LmZsb29yKHNyYy5nZXRNaW5ZKCkgLSBib3VuZGFyeSksCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKHNyYy5nZXRXaWR0aCgpICsgMiAqIGJvdW5k
YXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmNl
aWwoc3JjLmdldEhlaWdodCgpKSArIDIgKiBib3VuZGFyeSk7CiAgICB9CgogICAgcHJpdmF0ZSBU
ZXh0dXJlUmVuZGVyZXIgZ2V0QmFja2luZ1N0b3JlKCkgewogICAgICAgIFRleHR1cmVSZW5kZXJl
ciByZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIpIHBhY2tlci5nZXRCYWNraW5nU3RvcmUoKTsK
CiAgICAgICAgaWYgKHJlbmRlcmVyICE9IGNhY2hlZEJhY2tpbmdTdG9yZSkgewogICAgICAgICAg
ICAvLyBCYWNraW5nIHN0b3JlIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lOyBkaXNjYXJkIGFueSBj
YWNoZWQgR3JhcGhpY3MyRAogICAgICAgICAgICBpZiAoY2FjaGVkR3JhcGhpY3MgIT0gbnVsbCkg
ewogICAgICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3MuZGlzcG9zZSgpOwogICAgICAgICAgICAg
ICAgY2FjaGVkR3JhcGhpY3MgPSBudWxsOwogICAgICAgICAgICAgICAgY2FjaGVkRm9udFJlbmRl
ckNvbnRleHQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWNoZWRCYWNraW5n
U3RvcmUgPSByZW5kZXJlcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjYWNoZWRCYWNraW5n
U3RvcmU7CiAgICB9CgogICAgcHJpdmF0ZSBHcmFwaGljczJEIGdldEdyYXBoaWNzMkQoKSB7CiAg
ICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CgogICAg
ICAgIGlmIChjYWNoZWRHcmFwaGljcyA9PSBudWxsKSB7CiAgICAgICAgICAgIGNhY2hlZEdyYXBo
aWNzID0gcmVuZGVyZXIuY3JlYXRlR3JhcGhpY3MoKTsKCiAgICAgICAgICAgIC8vIFNldCB1cCBj
b21wb3NpdGUsIGZvbnQgYW5kIHJlbmRlcmluZyBoaW50cwogICAgICAgICAgICBjYWNoZWRHcmFw
aGljcy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuU3JjKTsKICAgICAgICAgICAgY2FjaGVk
R3JhcGhpY3Muc2V0Q29sb3IoQ29sb3IuV0hJVEUpOwogICAgICAgICAgICBjYWNoZWRHcmFwaGlj
cy5zZXRGb250KGZvbnQpOwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdI
aW50KFJlbmRlcmluZ0hpbnRzLktFWV9URVhUX0FOVElBTElBU0lORywKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW50aWFsaWFzZWQgPyBSZW5kZXJpbmdIaW50
cy5WQUxVRV9URVhUX0FOVElBTElBU19PTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICA6IFJlbmRlcmluZ0hpbnRzLlZBTFVFX1RFWFRfQU5USUFMSUFTX09GRikp
OwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hp
bnRzLktFWV9GUkFDVElPTkFMTUVUUklDUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodXNlRnJhY3Rpb25hbE1ldHJpY3MKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgPyBSZW5kZXJpbmdIaW50cy5WQUxVRV9GUkFDVElPTkFM
TUVUUklDU19PTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6
IFJlbmRlcmluZ0hpbnRzLlZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09GRikpOwogICAgICAgIH0K
CiAgICAgICAgcmV0dXJuIGNhY2hlZEdyYXBoaWNzOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBi
ZWdpblJlbmRlcmluZyhib29sZWFuIG9ydGhvLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlRGVwdGhUZXN0Rm9yT3J0
aG8pIHsKICAgICAgICBpZiAoREVCVUcgJiYgIWRlYnVnZ2VkKSB7CiAgICAgICAgICAgIGRlYnVn
KCk7CiAgICAgICAgfQoKICAgICAgICBpbkJlZ2luRW5kUGFpciA9IHRydWU7CiAgICAgICAgaXNP
cnRob01vZGUgPSBvcnRobzsKICAgICAgICBiZWdpblJlbmRlcmluZ1dpZHRoID0gd2lkdGg7CiAg
ICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgYmVnaW5SZW5kZXJp
bmdEZXB0aFRlc3REaXNhYmxlZCA9IGRpc2FibGVEZXB0aFRlc3RGb3JPcnRobzsKCiAgICAgICAg
aWYgKG9ydGhvKSB7CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmJlZ2luT3J0aG9SZW5k
ZXJpbmcod2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0Rm9yT3J0aG8pOwogICAgICAgIH0gZWxzZSB7
CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmJlZ2luM0RSZW5kZXJpbmcoKTsKICAgICAg
ICB9CgogICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwoKICAgICAgICAvLyBQdXNo
IGNsaWVudCBhdHRyaWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgog
ICAgICAgIGdsLmdsUHVzaENsaWVudEF0dHJpYigoaW50KSBHTC5HTF9BTExfQ0xJRU5UX0FUVFJJ
Ql9CSVRTKTsKCiAgICAgICAgaWYgKCFoYXZlTWF4U2l6ZSkgewogICAgICAgICAgICAvLyBRdWVy
eSBPcGVuR0wgZm9yIHRoZSBtYXhpbXVtIHRleHR1cmUgc2l6ZSBhbmQgc2V0IGl0IGluIHRoZQog
ICAgICAgICAgICAvLyBSZWN0YW5nbGVQYWNrZXIgdG8ga2VlcCBpdCBmcm9tIGV4cGFuZGluZyB0
b28gbGFyZ2UKICAgICAgICAgICAgaW50W10gc3ogPSBuZXcgaW50WzFdOwogICAgICAgICAgICBn
bC5nbEdldEludGVnZXJ2KEdMLkdMX01BWF9URVhUVVJFX1NJWkUsIHN6LCAwKTsKICAgICAgICAg
ICAgcGFja2VyLnNldE1heFNpemUoc3pbMF0sIHN6WzBdKTsKICAgICAgICAgICAgaGF2ZU1heFNp
emUgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5lZWRUb1Jlc2V0Q29sb3IgJiYgaGF2
ZUNhY2hlZENvbG9yKSB7CiAgICAgICAgICAgIGlmIChjYWNoZWRDb2xvciA9PSBudWxsKSB7CiAg
ICAgICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xvcihjYWNoZWRSLCBjYWNoZWRH
LCBjYWNoZWRCLCBjYWNoZWRBKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAg
IGdldEJhY2tpbmdTdG9yZSgpLnNldENvbG9yKGNhY2hlZENvbG9yKTsKICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgbmVlZFRvUmVzZXRDb2xvciA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAg
Ly8gRGlzYWJsZSBmdXR1cmUgYXR0ZW1wdHMgdG8gdXNlIG1pcG1hcHBpbmcgaWYgVGV4dHVyZVJl
bmRlcmVyCiAgICAgICAgLy8gZG9lc24ndCBzdXBwb3J0IGl0CiAgICAgICAgaWYgKG1pcG1hcCAm
JiAhZ2V0QmFja2luZ1N0b3JlKCkuaXNVc2luZ0F1dG9NaXBtYXBHZW5lcmF0aW9uKCkpIHsKICAg
ICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4o
IkRpc2FibGVkIG1pcG1hcHBpbmcgaW4gVGV4dFJlbmRlcmVyIik7CiAgICAgICAgICAgIH0KCiAg
ICAgICAgICAgIG1pcG1hcCA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAq
IGVtemljOiBoZXJlIHRoZSBjYWxsIHRvIGdsQmluZEJ1ZmZlciBjcmFzaGVzIG9uIGNlcnRhaW4g
Z3JhcGhpY3NjYXJkL2RyaXZlciBjb21iaW5hdGlvbnMKICAgICAqIHRoaXMgaXMgd2h5IHRoZSB1
Z2x5IHRyeS1jYXRjaCBibG9jayBoYXMgYmVlbiBhZGRlZCwgd2hpY2ggZmFsbHMgYmFjayB0byB0
aGUgb2xkIHRleHRyZW5kZXJlcgogICAgICogCiAgICAgKiBAcGFyYW0gb3J0aG8KICAgICAqIEB0
aHJvd3MgR0xFeGNlcHRpb24KICAgICAqLwogICAgcHJpdmF0ZSB2b2lkIGVuZFJlbmRlcmluZyhi
b29sZWFuIG9ydGhvKSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGZsdXNoR2x5cGhQaXBl
bGluZSgpOwoKICAgICAgICBpbkJlZ2luRW5kUGFpciA9IGZhbHNlOwoKICAgICAgICBHTCBnbCA9
IEdMVS5nZXRDdXJyZW50R0woKTsKCiAgICAgICAgLy8gUG9wIGNsaWVudCBhdHRyaWIgYml0cyB1
c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgogICAgICAgIGdsLmdsUG9wQ2xpZW50
QXR0cmliKCk7CgogICAgICAgIC8vIFRoZSBPcGVuR0wgc3BlYyBpcyB1bmNsZWFyIGFib3V0IHdo
ZXRoZXIgdGhpcyBjaGFuZ2VzIHRoZQogICAgICAgIC8vIGJ1ZmZlciBiaW5kaW5ncywgc28gcHJl
ZW1wdGl2ZWx5IHplcm8gb3V0IHRoZSBHTF9BUlJBWV9CVUZGRVIKICAgICAgICAvLyBiaW5kaW5n
CiAgICAgICAgaWYgKGlzVkJPQXZhaWxhYmxlKGdsKSkgewogICAgICAgICAgICB0cnkgewoJICAg
ICAgICAgaWYgKGlzQVJCRXh0ZW5zaW9uQXZhaWxhYmxlX1ZCTykgewoJCSAgICAgZ2wuZ2xCaW5k
QnVmZmVyQVJCKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7CgkJIH0gZWxzZSB7CgkJICAgICBnbC5n
bEJpbmRCdWZmZXIoR0wuR0xfQVJSQVlfQlVGRkVSLCAwKTsgICAKCQkgfQogICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBp
c0V4dGVuc2lvbkF2YWlsYWJsZV9WQk8gPSBmYWxzZTsKCQlpc0FSQkV4dGVuc2lvbkF2YWlsYWJs
ZV9WQk8gPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG9ydGhv
KSB7CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmVuZE9ydGhvUmVuZGVyaW5nKCk7CiAg
ICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuZW5kM0RSZW5kZXJp
bmcoKTsKICAgICAgICB9CgogICAgICAgIGlmICgrK251bVJlbmRlckN5Y2xlcyA+PSBDWUNMRVNf
UEVSX0ZMVVNIKSB7CiAgICAgICAgICAgIG51bVJlbmRlckN5Y2xlcyA9IDA7CgogICAgICAgICAg
ICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xlYXJp
bmcgdW51c2VkIGVudHJpZXMgaW4gZW5kUmVuZGVyaW5nKCkiKTsKICAgICAgICAgICAgfQoKICAg
ICAgICAgICAgY2xlYXJVbnVzZWRFbnRyaWVzKCk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZh
dGUgdm9pZCBjbGVhclVudXNlZEVudHJpZXMoKSB7CiAgICAgICAgZmluYWwgamF2YS51dGlsLkxp
c3QgZGVhZFJlY3RzID0gbmV3IEFycmF5TGlzdCAvKjxSZWN0PiovKCk7CgogICAgICAgIC8vIEl0
ZXJhdGUgdGhyb3VnaCB0aGUgY29udGVudHMgb2YgdGhlIGJhY2tpbmcgc3RvcmUsIHJlbW92aW5n
CiAgICAgICAgLy8gdGV4dCBzdHJpbmdzIHRoYXQgaGF2ZW4ndCBiZWVuIHVzZWQgcmVjZW50bHkK
ICAgICAgICBwYWNrZXIudmlzaXQobmV3IFJlY3RWaXNpdG9yKCkgewogICAgICAgICAgICAgICAg
cHVibGljIHZvaWQgdmlzaXQoUmVjdCByZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgVGV4dERh
dGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwoKICAgICAgICAgICAgICAg
ICAgICBpZiAoZGF0YS51c2VkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jbGVh
clVzZWQoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAg
ICAgICBkZWFkUmVjdHMuYWRkKHJlY3QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGRl
YWRSZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKICAgICAgICAgICAgUmVjdCBy
ID0gKFJlY3QpIGl0ZXIubmV4dCgpOwogICAgICAgICAgICBwYWNrZXIucmVtb3ZlKHIpOwogICAg
ICAgICAgICBzdHJpbmdMb2NhdGlvbnMucmVtb3ZlKCgoVGV4dERhdGEpIHIuZ2V0VXNlckRhdGEo
KSkuc3RyaW5nKCkpOwoKICAgICAgICAgICAgaW50IHVuaWNvZGVUb0NsZWFyRnJvbUNhY2hlID0g
KChUZXh0RGF0YSkgci5nZXRVc2VyRGF0YSgpKS51bmljb2RlSUQ7CgogICAgICAgICAgICBpZiAo
dW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUgPiAwKSB7CiAgICAgICAgICAgICAgICBtR2x5cGhQcm9k
dWNlci5jbGVhckNhY2hlRW50cnkodW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUpOwogICAgICAgICAg
ICB9CgogICAgICAgICAgICAvLyAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAvLyAgICAg
ICAgR3JhcGhpY3MyRCBnID0gZ2V0R3JhcGhpY3MyRCgpOwogICAgICAgICAgICAvLyAgICAgICAg
Zy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOwogICAgICAgICAgICAvLyAgICAg
ICAgZy5maWxsUmVjdChyLngoKSwgci55KCksIHIudygpLCByLmgoKSk7CiAgICAgICAgICAgIC8v
ICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0ZS5TcmMpOwogICAgICAgICAgICAv
LyAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIElmIHdlIHJlbW92ZWQgZGVhZCByZWN0YW5n
bGVzIHRoaXMgY3ljbGUsIHRyeSB0byBkbyBhIGNvbXBhY3Rpb24KICAgICAgICBmbG9hdCBmcmFn
ID0gcGFja2VyLnZlcnRpY2FsRnJhZ21lbnRhdGlvblJhdGlvKCk7CgogICAgICAgIGlmICghZGVh
ZFJlY3RzLmlzRW1wdHkoKSAmJiAoZnJhZyA+IE1BWF9WRVJUSUNBTF9GUkFHTUVOVEFUSU9OKSkg
ewogICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJp
bnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFjdGluZyBUZXh0
UmVuZGVyZXIgYmFja2luZyBzdG9yZSBkdWUgdG8gdmVydGljYWwgZnJhZ21lbnRhdGlvbiAiICsK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnKTsKICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgcGFja2VyLmNvbXBhY3QoKTsKICAgICAgICB9CgogICAgICAgIGlmIChERUJV
RykgewogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5tYXJrRGlydHkoMCwgMCwgZ2V0QmFj
a2luZ1N0b3JlKCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmdldEhlaWdodCgpKTsKICAgICAgICB9CiAgICB9Cgog
ICAgcHJpdmF0ZSB2b2lkIGludGVybmFsX2RyYXczRChDaGFyU2VxdWVuY2Ugc3RyLCBmbG9hdCB4
LCBmbG9hdCB5LCBmbG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9h
dCBzY2FsZUZhY3RvcikgewogICAgICAgIExpc3QvKjxHbHlwaD4qLyBnbHlwaHMgPSBtR2x5cGhQ
cm9kdWNlci5nZXRHbHlwaHMoc3RyKTsKICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnbHlw
aHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewogICAgICAgICAgICBHbHlwaCBnbHlw
aCA9IChHbHlwaCkgaXRlci5uZXh0KCk7CiAgICAgICAgICAgIGZsb2F0IGFkdmFuY2UgPSBnbHlw
aC5kcmF3M0QoeCwgeSwgeiwgc2NhbGVGYWN0b3IpOwogICAgICAgICAgICB4ICs9IGFkdmFuY2Ug
KiBzY2FsZUZhY3RvcjsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGZsdXNoR2x5
cGhQaXBlbGluZSgpIHsKICAgICAgICBpZiAobVBpcGVsaW5lZFF1YWRSZW5kZXJlciAhPSBudWxs
KSB7CiAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZHJhdygpOwogICAgICAgIH0K
ICAgIH0KCiAgICBwcml2YXRlIHZvaWQgZHJhdzNEX1JPQlVTVChDaGFyU2VxdWVuY2Ugc3RyLCBm
bG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAgICAgICBTdHJpbmcgY3VyU3RyOwogICAgICAgIGlmIChz
dHIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKICAgICAgICAgICAgY3VyU3RyID0gKFN0cmluZykgc3Ry
OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN1clN0ciA9IHN0ci50b1N0cmluZygpOwog
ICAgICAgIH0KCiAgICAgICAgLy8gTG9vayB1cCB0aGUgc3RyaW5nIG9uIHRoZSBiYWNraW5nIHN0
b3JlCiAgICAgICAgUmVjdCByZWN0ID0gKFJlY3QpIHN0cmluZ0xvY2F0aW9ucy5nZXQoY3VyU3Ry
KTsKCiAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBSYXN0ZXJpemUg
dGhpcyBzdHJpbmcgYW5kIHBsYWNlIGl0IG9uIHRoZSBiYWNraW5nIHN0b3JlCiAgICAgICAgICAg
IEdyYXBoaWNzMkQgZyA9IGdldEdyYXBoaWNzMkQoKTsKICAgICAgICAgICAgUmVjdGFuZ2xlMkQg
b3JpZ0JCb3ggPSBwcmVOb3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKGN1clN0ciwg
Zm9udCwgZ2V0Rm9udFJlbmRlckNvbnRleHQoKSkpOwogICAgICAgICAgICBSZWN0YW5nbGUyRCBi
Ym94ID0gbm9ybWFsaXplKG9yaWdCQm94KTsKICAgICAgICAgICAgUG9pbnQgb3JpZ2luID0gbmV3
IFBvaW50KChpbnQpIC1iYm94LmdldE1pblgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChpbnQpIC1iYm94LmdldE1pblkoKSk7CiAgICAgICAgICAgIHJlY3QgPSBuZXcg
UmVjdCgwLCAwLCAoaW50KSBiYm94LmdldFdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAoaW50KSBiYm94LmdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
bmV3IFRleHREYXRhKGN1clN0ciwgb3JpZ2luLCBvcmlnQkJveCwgLTEpKTsKCiAgICAgICAgICAg
IHBhY2tlci5hZGQocmVjdCk7CiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5wdXQoY3VyU3Ry
LCByZWN0KTsKCiAgICAgICAgICAgIC8vIFJlLWZldGNoIHRoZSBHcmFwaGljczJEIGluIGNhc2Ug
dGhlIGFkZGl0aW9uIG9mIHRoZSByZWN0YW5nbGUKICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSBv
bGQgYmFja2luZyBzdG9yZSB0byBiZSB0aHJvd24gYXdheQogICAgICAgICAgICBnID0gZ2V0R3Jh
cGhpY3MyRCgpOwoKICAgICAgICAgICAgLy8gT0ssIHNob3VsZCBub3cgaGF2ZSBhbiAoeCwgeSkg
Zm9yIHRoaXMgcmVjdGFuZ2xlOyByYXN0ZXJpemUKICAgICAgICAgICAgLy8gdGhlIFN0cmluZwog
ICAgICAgICAgICBpbnQgc3RyeCA9IHJlY3QueCgpICsgb3JpZ2luLng7CiAgICAgICAgICAgIGlu
dCBzdHJ5ID0gcmVjdC55KCkgKyBvcmlnaW4ueTsKCiAgICAgICAgICAgIC8vIENsZWFyIG91dCB0
aGUgYXJlYSB3ZSdyZSBnb2luZyB0byBkcmF3IGludG8KICAgICAgICAgICAgZy5zZXRDb21wb3Np
dGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOwogICAgICAgICAgICBnLmZpbGxSZWN0KHJlY3QueCgp
LCByZWN0LnkoKSwgcmVjdC53KCksIHJlY3QuaCgpKTsKICAgICAgICAgICAgZy5zZXRDb21wb3Np
dGUoQWxwaGFDb21wb3NpdGUuU3JjKTsKCiAgICAgICAgICAgIC8vIERyYXcgdGhlIHN0cmluZwog
ICAgICAgICAgICByZW5kZXJEZWxlZ2F0ZS5kcmF3KGcsIGN1clN0ciwgc3RyeCwgc3RyeSk7Cgog
ICAgICAgICAgICBpZiAoRFJBV19CQk9YRVMpIHsKICAgICAgICAgICAgICAgIFRleHREYXRhIGRh
dGEgPSAoVGV4dERhdGEpIHJlY3QuZ2V0VXNlckRhdGEoKTsKICAgICAgICAgICAgICAgIC8vIERy
YXcgYSBib3VuZGluZyBib3ggb24gdGhlIGJhY2tpbmcgc3RvcmUKICAgICAgICAgICAgICAgIGcu
ZHJhd1JlY3Qoc3RyeCAtIGRhdGEub3JpZ09yaWdpblgoKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc3RyeSAtIGRhdGEub3JpZ09yaWdpblkoKSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGludCkgZGF0YS5vcmlnUmVjdCgpLmdldFdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChpbnQpIGRhdGEub3JpZ1JlY3QoKS5nZXRIZWlnaHQoKSk7CiAgICAgICAgICAgICAg
ICBnLmRyYXdSZWN0KHN0cnggLSBkYXRhLm9yaWdpbigpLngsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0cnkgLSBkYXRhLm9yaWdpbigpLnksCiAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJlY3QudygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmgoKSk7CiAgICAgICAg
ICAgIH0KCiAgICAgICAgICAgIC8vIE1hcmsgdGhpcyByZWdpb24gb2YgdGhlIFRleHR1cmVSZW5k
ZXJlciBhcyBkaXJ0eQogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5tYXJrRGlydHkocmVj
dC54KCksIHJlY3QueSgpLCByZWN0LncoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICB9CgogICAgICAgIC8vIE9LLCBub3cgZHJhdyB0
aGUgcG9ydGlvbiBvZiB0aGUgYmFja2luZyBzdG9yZSB0byB0aGUgc2NyZWVuCiAgICAgICAgVGV4
dHVyZVJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CgogICAgICAgIC8vIE5P
VEUgdGhhdCB0aGUgcmVjdGFuZ2xlcyBtYW5hZ2VkIGJ5IHRoZSBwYWNrZXIgaGF2ZSB0aGVpcgog
ICAgICAgIC8vIG9yaWdpbiBhdCB0aGUgdXBwZXItbGVmdCBidXQgdGhlIFRleHR1cmVSZW5kZXJl
cidzIG9yaWdpbiBpcwogICAgICAgIC8vIGF0IGl0cyBsb3dlciBsZWZ0ISEhCiAgICAgICAgVGV4
dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwogICAgICAgIGRhdGEu
bWFya1VzZWQoKTsKCiAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QgPSBkYXRhLm9yaWdSZWN0
KCk7CiAgICAgICAgCiAgICAgICAgLy8gQWxpZ24gdGhlIGxlZnRtb3N0IHBvaW50IG9mIHRoZSBi
YXNlbGluZSB0byB0aGUgKHgsIHksIHopIGNvb3JkaW5hdGUgcmVxdWVzdGVkCiAgICAgICAgcmVu
ZGVyZXIuZHJhdzNEUmVjdCh4IC0gKHNjYWxlRmFjdG9yICogZGF0YS5vcmlnT3JpZ2luWCgpKSwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLSAoc2NhbGVGYWN0b3IgKiAoKGZsb2F0KSBv
cmlnUmVjdC5nZXRIZWlnaHQoKSAtIGRhdGEub3JpZ09yaWdpblkoKSkpLCB6LAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmVjdC54KCkgKyAoZGF0YS5vcmlnaW4oKS54IC0gZGF0YS5vcmln
T3JpZ2luWCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLmdldEhlaWdo
dCgpIC0gcmVjdC55KCkgLSAoaW50KSBvcmlnUmVjdC5nZXRIZWlnaHQoKSAtCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChkYXRhLm9yaWdpbigpLnkgLSBkYXRhLm9yaWdPcmlnaW5ZKCkp
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgb3JpZ1JlY3QuZ2V0V2lkdGgoKSwg
KGludCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCksIHNjYWxlRmFjdG9yKTsKICAgIH0KCiAgICAvLy0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KICAgIC8vIERlYnVnZ2luZyBmdW5jdGlvbmFsaXR5CiAgICAvLwogICAgcHJp
dmF0ZSB2b2lkIGRlYnVnKCkgewogICAgICAgIGRiZ0ZyYW1lID0gbmV3IEZyYW1lKCJUZXh0UmVu
ZGVyZXIgRGVidWcgT3V0cHV0Iik7CgogICAgICAgIEdMQ2FudmFzIGRiZ0NhbnZhcyA9IG5ldyBH
TENhbnZhcyhuZXcgR0xDYXBhYmlsaXRpZXMoKSwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgR0xDb250ZXh0LmdldEN1cnJlbnQoKSwgbnVsbCk7CiAgICAg
ICAgZGJnQ2FudmFzLmFkZEdMRXZlbnRMaXN0ZW5lcihuZXcgRGVidWdMaXN0ZW5lcihkYmdGcmFt
ZSkpOwogICAgICAgIGRiZ0ZyYW1lLmFkZChkYmdDYW52YXMpOwoKICAgICAgICBmaW5hbCBGUFNB
bmltYXRvciBhbmltID0gbmV3IEZQU0FuaW1hdG9yKGRiZ0NhbnZhcywgMTApOwogICAgICAgIGRi
Z0ZyYW1lLmFkZFdpbmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkgewogICAgICAgICAg
ICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7CiAgICAgICAg
ICAgICAgICAgICAgLy8gUnVuIHRoaXMgb24gYW5vdGhlciB0aHJlYWQgdGhhbiB0aGUgQVdUIGV2
ZW50IHF1ZXVlIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBjYWxsIHRv
IEFuaW1hdG9yLnN0b3AoKSBjb21wbGV0ZXMgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgLy8g
ZXhpdGluZwogICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KS5zdGFydCgpOwogICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICB9KTsKICAgICAgICBkYmdGcmFtZS5zZXRTaXplKGtTaXplLCBrU2l6
ZSk7CiAgICAgICAgZGJnRnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKICAgICAgICBhbmltLnN0YXJ0
KCk7CiAgICAgICAgZGVidWdnZWQgPSB0cnVlOwogICAgfQoKICAgIC8qKiBDbGFzcyBzdXBwb3J0
aW5nIG1vcmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIHByb2Nlc3Mgb2YgcmVuZGVyaW5nCiAgICAg
ICAgdGhlIGJpdG1hcHBlZCB0ZXh0LiBBbGxvd3MgY3VzdG9taXphdGlvbiBvZiB3aGV0aGVyIHRo
ZSBiYWNraW5nCiAgICAgICAgc3RvcmUgdGV4dCBiaXRtYXAgaXMgZnVsbC1jb2xvciBvciBpbnRl
bnNpdHkgb25seSwgdGhlIHNpemUgb2YKICAgICAgICBlYWNoIGluZGl2aWR1YWwgcmVuZGVyZWQg
dGV4dCByZWN0YW5nbGUsIGFuZCB0aGUgY29udGVudHMgb2YKICAgICAgICBlYWNoIGluZGl2aWR1
YWwgcmVuZGVyZWQgdGV4dCBzdHJpbmcuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAg
ICAgb2YgdGhpcyBpbnRlcmZhY2UgdXNlcyBhbiBpbnRlbnNpdHktb25seSB0ZXh0dXJlLCBhCiAg
ICAgICAgY2xvc2VseS1jcm9wcGVkIHJlY3RhbmdsZSBhcm91bmQgdGhlIHRleHQsIGFuZCByZW5k
ZXJzIHRleHQKICAgICAgICB1c2luZyB0aGUgY29sb3Igd2hpdGUsIHdoaWNoIGlzIG1vZHVsYXRl
ZCBieSB0aGUgc2V0IGNvbG9yCiAgICAgICAgZHVyaW5nIHRoZSByZW5kZXJpbmcgcHJvY2Vzcy4g
Ki8KICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlbmRlckRlbGVnYXRlIHsKICAgICAgICAv
KiogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJhY2tpbmcgc3RvcmUgb2YgdGhpcyBUZXh0UmVuZGVy
ZXIKICAgICAgICAgICAgc2hvdWxkIGJlIGludGVuc2l0eS1vbmx5ICh0aGUgZGVmYXVsdCkgb3Ig
ZnVsbC1jb2xvci4gKi8KICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlbnNpdHlPbmx5KCk7Cgog
ICAgICAgIC8qKiBDb21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBTdHJpbmcgcmVsYXRp
dmUgdG8gdGhlCiAgICAgICAgICAgIG9yaWdpbi4gKi8KICAgICAgICBwdWJsaWMgUmVjdGFuZ2xl
MkQgZ2V0Qm91bmRzKFN0cmluZyBzdHIsIEZvbnQgZm9udCwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7CgogICAgICAgIC8qKiBDb21w
dXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVsYXRpdmUK
ICAgICAgICAgICAgdG8gdGhlIG9yaWdpbi4gKi8KICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQg
Z2V0Qm91bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7CgogICAgICAgIC8qKiBD
b21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBHbHlwaFZlY3RvciwgYWxyZWFkeQogICAg
ICAgICAgICBhc3N1bWVkIHRvIGhhdmUgYmVlbiBjcmVhdGVkIGZvciBhIHBhcnRpY3VsYXIgRm9u
dCwKICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbi4gKi8KICAgICAgICBwdWJsaWMg
UmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKEdseXBoVmVjdG9yIGd2LCBGb250UmVuZGVyQ29udGV4dCBm
cmMpOwoKICAgICAgICAvKiogUmVuZGVyIHRoZSBwYXNzZWQgY2hhcmFjdGVyIHNlcXVlbmNlIGF0
IHRoZSBkZXNpZ25hdGVkCiAgICAgICAgICAgIGxvY2F0aW9uIHVzaW5nIHRoZSBzdXBwbGllZCBH
cmFwaGljczJEIGluc3RhbmNlLiBUaGUKICAgICAgICAgICAgc3Vycm91bmRpbmcgcmVnaW9uIHdp
bGwgYWxyZWFkeSBoYXZlIGJlZW4gY2xlYXJlZCB0byB0aGUgUkdCCiAgICAgICAgICAgIGNvbG9y
ICgwLCAwLCAwKSB3aXRoIHplcm8gYWxwaGEuIFRoZSBpbml0aWFsIGRyYXdpbmcgY29udGV4dAog
ICAgICAgICAgICBvZiB0aGUgcGFzc2VkIEdyYXBoaWNzMkQgd2lsbCBiZSBzZXQgdG8gdXNlCiAg
ICAgICAgICAgIEFscGhhQ29tcG9zaXRlLlNyYywgdGhlIGNvbG9yIHdoaXRlLCB0aGUgRm9udCBz
cGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgIFRleHRSZW5kZXJlcidzIGNvbnN0cnVjdG9yLCBh
bmQgdGhlIHJlbmRlcmluZyBoaW50cyBzcGVjaWZpZWQKICAgICAgICAgICAgaW4gdGhlIFRleHRS
ZW5kZXJlciBjb25zdHJ1Y3Rvci4gIENoYW5nZXMgbWFkZSBieSB0aGUgZW5kIHVzZXIKICAgICAg
ICAgICAgbWF5IGJlIHZpc2libGUgaW4gc3VjY2Vzc2l2ZSBjYWxscyB0byB0aGlzIG1ldGhvZCwg
YnV0IGFyZSBub3QKICAgICAgICAgICAgZ3VhcmFudGVlZCB0byBiZSBwcmVzZXJ2ZWQuICBJbXBs
ZW1lbnRvcnMgb2YgdGhpcyBtZXRob2QKICAgICAgICAgICAgc2hvdWxkIHJlc2V0IHRoZSBHcmFw
aGljczJEJ3Mgc3RhdGUgdG8gdGhhdCBkZXNpcmVkIGVhY2ggdGltZQogICAgICAgICAgICB0aGlz
IG1ldGhvZCBpcyBjYWxsZWQsIGluIHBhcnRpY3VsYXIgdGhvc2Ugc3RhdGVzIHdoaWNoIGFyZQog
ICAgICAgICAgICBub3QgdGhlIGRlZmF1bHRzLiAqLwogICAgICAgIHB1YmxpYyB2b2lkIGRyYXco
R3JhcGhpY3MyRCBncmFwaGljcywgU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KTsKCiAgICAgICAg
LyoqIFJlbmRlciB0aGUgcGFzc2VkIEdseXBoVmVjdG9yIGF0IHRoZSBkZXNpZ25hdGVkIGxvY2F0
aW9uIHVzaW5nCiAgICAgICAgICAgIHRoZSBzdXBwbGllZCBHcmFwaGljczJEIGluc3RhbmNlLiBU
aGUgc3Vycm91bmRpbmcgcmVnaW9uIHdpbGwKICAgICAgICAgICAgYWxyZWFkeSBoYXZlIGJlZW4g
Y2xlYXJlZCB0byB0aGUgUkdCIGNvbG9yICgwLCAwLCAwKSB3aXRoIHplcm8KICAgICAgICAgICAg
YWxwaGEuIFRoZSBpbml0aWFsIGRyYXdpbmcgY29udGV4dCBvZiB0aGUgcGFzc2VkIEdyYXBoaWNz
MkQKICAgICAgICAgICAgd2lsbCBiZSBzZXQgdG8gdXNlIEFscGhhQ29tcG9zaXRlLlNyYywgdGhl
IGNvbG9yIHdoaXRlLCB0aGUKICAgICAgICAgICAgRm9udCBzcGVjaWZpZWQgaW4gdGhlIFRleHRS
ZW5kZXJlcidzIGNvbnN0cnVjdG9yLCBhbmQgdGhlCiAgICAgICAgICAgIHJlbmRlcmluZyBoaW50
cyBzcGVjaWZpZWQgaW4gdGhlIFRleHRSZW5kZXJlciBjb25zdHJ1Y3Rvci4KICAgICAgICAgICAg
Q2hhbmdlcyBtYWRlIGJ5IHRoZSBlbmQgdXNlciBtYXkgYmUgdmlzaWJsZSBpbiBzdWNjZXNzaXZl
CiAgICAgICAgICAgIGNhbGxzIHRvIHRoaXMgbWV0aG9kLCBidXQgYXJlIG5vdCBndWFyYW50ZWVk
IHRvIGJlIHByZXNlcnZlZC4KICAgICAgICAgICAgSW1wbGVtZW50b3JzIG9mIHRoaXMgbWV0aG9k
IHNob3VsZCByZXNldCB0aGUgR3JhcGhpY3MyRCdzCiAgICAgICAgICAgIHN0YXRlIHRvIHRoYXQg
ZGVzaXJlZCBlYWNoIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpbgogICAgICAgICAgICBw
YXJ0aWN1bGFyIHRob3NlIHN0YXRlcyB3aGljaCBhcmUgbm90IHRoZSBkZWZhdWx0cy4gKi8KICAg
ICAgICBwdWJsaWMgdm9pZCBkcmF3R2x5cGhWZWN0b3IoR3JhcGhpY3MyRCBncmFwaGljcywgR2x5
cGhWZWN0b3Igc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwg
aW50IHkpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYXJTZXF1ZW5jZUl0ZXJh
dG9yIGltcGxlbWVudHMgQ2hhcmFjdGVySXRlcmF0b3IgewogICAgICAgIENoYXJTZXF1ZW5jZSBt
U2VxdWVuY2U7CiAgICAgICAgaW50IG1MZW5ndGg7CiAgICAgICAgaW50IG1DdXJyZW50SW5kZXg7
CgogICAgICAgIENoYXJTZXF1ZW5jZUl0ZXJhdG9yKCkgewogICAgICAgIH0KCiAgICAgICAgQ2hh
clNlcXVlbmNlSXRlcmF0b3IoQ2hhclNlcXVlbmNlIHNlcXVlbmNlKSB7CiAgICAgICAgICAgIGlu
aXRGcm9tQ2hhclNlcXVlbmNlKHNlcXVlbmNlKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2
b2lkIGluaXRGcm9tQ2hhclNlcXVlbmNlKENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSkgewogICAgICAg
ICAgICBtU2VxdWVuY2UgPSBzZXF1ZW5jZTsKICAgICAgICAgICAgbUxlbmd0aCA9IG1TZXF1ZW5j
ZS5sZW5ndGgoKTsKICAgICAgICAgICAgbUN1cnJlbnRJbmRleCA9IDA7CiAgICAgICAgfQoKICAg
ICAgICBwdWJsaWMgY2hhciBsYXN0KCkgewogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0gTWF0
aC5tYXgoMCwgbUxlbmd0aCAtIDEpOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQoKTsKICAg
ICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFyIGN1cnJlbnQoKSB7CiAgICAgICAgICAgIGlmICgo
bUxlbmd0aCA9PSAwKSB8fCAobUN1cnJlbnRJbmRleCA+PSBtTGVuZ3RoKSkgewogICAgICAgICAg
ICAgICAgcmV0dXJuIENoYXJhY3Rlckl0ZXJhdG9yLkRPTkU7CiAgICAgICAgICAgIH0KCiAgICAg
ICAgICAgIHJldHVybiBtU2VxdWVuY2UuY2hhckF0KG1DdXJyZW50SW5kZXgpOwogICAgICAgIH0K
CiAgICAgICAgcHVibGljIGNoYXIgbmV4dCgpIHsKICAgICAgICAgICAgbUN1cnJlbnRJbmRleCsr
OwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQoKTsKICAgICAgICB9CgogICAgICAgIHB1Ymxp
YyBjaGFyIHByZXZpb3VzKCkgewogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0gTWF0aC5tYXgo
bUN1cnJlbnRJbmRleCAtIDEsIDApOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQoKTsKICAg
ICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFyIHNldEluZGV4KGludCBwb3NpdGlvbikgewogICAg
ICAgICAgICBtQ3VycmVudEluZGV4ID0gcG9zaXRpb247CgogICAgICAgICAgICByZXR1cm4gY3Vy
cmVudCgpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBnZXRCZWdpbkluZGV4KCkgewog
ICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBpbnQgZ2V0RW5k
SW5kZXgoKSB7CiAgICAgICAgICAgIHJldHVybiBtTGVuZ3RoOwogICAgICAgIH0KCiAgICAgICAg
cHVibGljIGludCBnZXRJbmRleCgpIHsKICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50SW5kZXg7
CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAgICAgICAgICBD
aGFyU2VxdWVuY2VJdGVyYXRvciBpdGVyID0gbmV3IENoYXJTZXF1ZW5jZUl0ZXJhdG9yKG1TZXF1
ZW5jZSk7CiAgICAgICAgICAgIGl0ZXIubUN1cnJlbnRJbmRleCA9IG1DdXJyZW50SW5kZXg7Cgog
ICAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFyIGZp
cnN0KCkgewogICAgICAgICAgICBpZiAobUxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICBy
ZXR1cm4gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAg
bUN1cnJlbnRJbmRleCA9IDA7CgogICAgICAgICAgICByZXR1cm4gY3VycmVudCgpOwogICAgICAg
IH0KICAgIH0KCiAgICAvLyBEYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHJlY3RhbmdsZSBvZiB0
ZXh0CiAgICBzdGF0aWMgY2xhc3MgVGV4dERhdGEgewogICAgICAgIC8vIEJhY2stcG9pbnRlciB0
byBTdHJpbmcgdGhpcyBUZXh0RGF0YSBkZXNjcmliZXMsIGlmIGl0CiAgICAgICAgLy8gcmVwcmVz
ZW50cyBhIFN0cmluZyByYXRoZXIgdGhhbiBhIHNpbmdsZSBnbHlwaAogICAgICAgIHByaXZhdGUg
U3RyaW5nIHN0cjsKCiAgICAgICAgLy8gSWYgdGhpcyBUZXh0RGF0YSByZXByZXNlbnRzIGEgc2lu
Z2xlIGdseXBoLCB0aGlzIGlzIGl0cwogICAgICAgIC8vIHVuaWNvZGUgSUQKICAgICAgICBpbnQg
dW5pY29kZUlEOwoKICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG11c3QgYmUgZGVmaW5lZCBhbmQg
dXNlZCBWRVJZIHByZWNpc2VseS4gVGhpcyBpcwogICAgICAgIC8vIHRoZSBvZmZzZXQgZnJvbSB0
aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhpcyByZWN0YW5nbGUgKEphdmEKICAgICAgICAvLyAy
RCBjb29yZGluYXRlIHN5c3RlbSkgYXQgd2hpY2ggdGhlIHN0cmluZyBtdXN0IGJlIHJhc3Rlcml6
ZWQgaW4KICAgICAgICAvLyBvcmRlciB0byBmaXQgd2l0aGluIHRoZSByZWN0YW5nbGUgLS0gdGhl
IGxlZnRtb3N0IHBvaW50IG9mIHRoZQogICAgICAgIC8vIGJhc2VsaW5lLgogICAgICAgIHByaXZh
dGUgUG9pbnQgb3JpZ2luOwoKICAgICAgICAvLyBUaGlzIHJlcHJlc2VudHMgdGhlIHByZS1ub3Jt
YWxpemVkIHJlY3RhbmdsZSwgd2hpY2ggZml0cwogICAgICAgIC8vIHdpdGhpbiB0aGUgcmVjdGFu
Z2xlIG9uIHRoZSBiYWNraW5nIHN0b3JlLiBXZSBrZWVwIGEKICAgICAgICAvLyBvbmUtcGl4ZWwg
Ym9yZGVyIGFyb3VuZCBlbnRyaWVzIG9uIHRoZSBiYWNraW5nIHN0b3JlIHRvCiAgICAgICAgLy8g
cHJldmVudCBibGVlZGluZyBvZiBhZGphY2VudCBsZXR0ZXJzIHdoZW4gdXNpbmcgR0xfTElORUFS
CiAgICAgICAgLy8gZmlsdGVyaW5nIGZvciByZW5kZXJpbmcuIFRoZSBvcmlnaW4gb2YgdGhpcyBy
ZWN0YW5nbGUgaXMKICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW4gYWJvdmUuCiAg
ICAgICAgcHJpdmF0ZSBSZWN0YW5nbGUyRCBvcmlnUmVjdDsKCiAgICAgICAgcHJpdmF0ZSBib29s
ZWFuIHVzZWQ7IC8vIFdoZXRoZXIgdGhpcyB0ZXh0IHdhcyB1c2VkIHJlY2VudGx5CgogICAgICAg
IFRleHREYXRhKFN0cmluZyBzdHIsIFBvaW50IG9yaWdpbiwgUmVjdGFuZ2xlMkQgb3JpZ1JlY3Qs
IGludCB1bmljb2RlSUQpIHsKICAgICAgICAgICAgdGhpcy5zdHIgPSBzdHI7CiAgICAgICAgICAg
IHRoaXMub3JpZ2luID0gb3JpZ2luOwogICAgICAgICAgICB0aGlzLm9yaWdSZWN0ID0gb3JpZ1Jl
Y3Q7CiAgICAgICAgICAgIHRoaXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAgICAgIH0KCiAg
ICAgICAgU3RyaW5nIHN0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICB9
CgogICAgICAgIFBvaW50IG9yaWdpbigpIHsKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbjsKICAg
ICAgICB9CgogICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcyBhcmUgdXNlZCB0
byBsb2NhdGUgdGhlIGdseXBoCiAgICAgICAgLy8gd2l0aGluIHRoZSBleHBhbmRlZCByZWN0YW5n
bGUgY29taW5nIGZyb20gbm9ybWFsaXplKCkKICAgICAgICBpbnQgb3JpZ09yaWdpblgoKSB7CiAg
ICAgICAgICAgIHJldHVybiAoaW50KSAtb3JpZ1JlY3QuZ2V0TWluWCgpOwogICAgICAgIH0KCiAg
ICAgICAgaW50IG9yaWdPcmlnaW5ZKCkgewogICAgICAgICAgICByZXR1cm4gKGludCkgLW9yaWdS
ZWN0LmdldE1pblkoKTsKICAgICAgICB9CgogICAgICAgIFJlY3RhbmdsZTJEIG9yaWdSZWN0KCkg
ewogICAgICAgICAgICByZXR1cm4gb3JpZ1JlY3Q7CiAgICAgICAgfQoKICAgICAgICBib29sZWFu
IHVzZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB1c2VkOwogICAgICAgIH0KCiAgICAgICAgdm9p
ZCBtYXJrVXNlZCgpIHsKICAgICAgICAgICAgdXNlZCA9IHRydWU7CiAgICAgICAgfQoKICAgICAg
ICB2b2lkIGNsZWFyVXNlZCgpIHsKICAgICAgICAgICAgdXNlZCA9IGZhbHNlOwogICAgICAgIH0K
ICAgIH0KCiAgICBjbGFzcyBNYW5hZ2VyIGltcGxlbWVudHMgQmFja2luZ1N0b3JlTWFuYWdlciB7
CiAgICAgICAgcHJpdmF0ZSBHcmFwaGljczJEIGc7CgogICAgICAgIHB1YmxpYyBPYmplY3QgYWxs
b2NhdGVCYWNraW5nU3RvcmUoaW50IHcsIGludCBoKSB7CiAgICAgICAgICAgIC8vIEZJWE1FOiBz
aG91bGQgY29uc2lkZXIgY2hlY2tpbmcgRm9udCdzIGF0dHJpYnV0ZXMgdG8gc2VlCiAgICAgICAg
ICAgIC8vIHdoZXRoZXIgd2UncmUgbGlrZWx5IHRvIG5lZWQgdG8gc3VwcG9ydCBhIGZ1bGwgUkdC
QSBiYWNraW5nCiAgICAgICAgICAgIC8vIHN0b3JlIChpLmUuLCBub24tZGVmYXVsdCBQYWludCwg
Zm9yZWdyb3VuZCBjb2xvciwgZXRjLiksIGJ1dAogICAgICAgICAgICAvLyBmb3Igbm93LCBsZXQn
cyBqdXN0IGJlIG1vcmUgZWZmaWNpZW50CiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5k
ZXJlcjsKCiAgICAgICAgICAgIGlmIChyZW5kZXJEZWxlZ2F0ZS5pbnRlbnNpdHlPbmx5KCkpIHsK
ICAgICAgICAgICAgICAgIHJlbmRlcmVyID0gVGV4dHVyZVJlbmRlcmVyLmNyZWF0ZUFscGhhT25s
eVJlbmRlcmVyKHcsIGgsIG1pcG1hcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg
ICAgICByZW5kZXJlciA9IG5ldyBUZXh0dXJlUmVuZGVyZXIodywgaCwgdHJ1ZSwgbWlwbWFwKTsK
ICAgICAgICAgICAgfQogICAgICAgICAgICByZW5kZXJlci5zZXRTbW9vdGhpbmcoc21vb3RoaW5n
KTsKCiAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgU3lzdGVtLmVyci5w
cmludGxuKCIgVGV4dFJlbmRlcmVyIGFsbG9jYXRpbmcgYmFja2luZyBzdG9yZSAiICsKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICsgIiB4ICIgKyBoKTsKICAgICAgICAgICAg
fQoKICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwogICAgICAgIH0KCiAgICAgICAgcHVibGlj
IHZvaWQgZGVsZXRlQmFja2luZ1N0b3JlKE9iamVjdCBiYWNraW5nU3RvcmUpIHsKICAgICAgICAg
ICAgKChUZXh0dXJlUmVuZGVyZXIpIGJhY2tpbmdTdG9yZSkuZGlzcG9zZSgpOwogICAgICAgIH0K
CiAgICAgICAgcHVibGljIGJvb2xlYW4gcHJlRXhwYW5kKFJlY3QgY2F1c2UsIGludCBhdHRlbXB0
TnVtYmVyKSB7CiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRoaXMgb25lIHRpbWU7IGNsZWFyIG91
dCBwb3RlbnRpYWxseSBvYnNvbGV0ZSBlbnRyaWVzCiAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMg
aGV1cmlzdGljIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGNsZWFycyB0aGUgdXNlZCBiaXQKICAgICAg
ICAgICAgLy8gb2YgYWxsIGVudHJpZXMgc2VlbXMgdG8gY2F1c2UgY3ljbGluZyBvZiBlbnRyaWVz
IGluIHNvbWUKICAgICAgICAgICAgLy8gc2l0dWF0aW9ucywgd2hlcmUgdGhlIGJhY2tpbmcgc3Rv
cmUgYmVjb21lcyBzbWFsbCBjb21wYXJlZCB0bwogICAgICAgICAgICAvLyB0aGUgYW1vdW50IG9m
IHRleHQgb24gdGhlIHNjcmVlbiAoc2VlIHRoZSBUZXh0RmxvdyBkZW1vKSBhbmQKICAgICAgICAg
ICAgLy8gdGhlIGVudHJpZXMgY29udGludWFsbHkgY3ljbGUgaW4gYW5kIG91dCBvZiB0aGUgYmFj
a2luZwogICAgICAgICAgICAvLyBzdG9yZSwgZGVjcmVhc2luZyBwZXJmb3JtYW5jZS4gSWYgd2Ug
YWRkZWQgYSBsaXR0bGUgYWdlCiAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIHRvIHRoZSBlbnRy
aWVzLCBhbmQgb25seSBjbGVhcmVkIG91dCBlbnRyaWVzCiAgICAgICAgICAgIC8vIGFib3ZlIGEg
Y2VydGFpbiBhZ2UsIHRoaXMgYmVoYXZpb3Igd291bGQgYmUgZWxpbWluYXRlZC4KICAgICAgICAg
ICAgLy8gSG93ZXZlciwgaXQgc2VlbXMgdGhlIHN5c3RlbSB1c3VhbGx5IHN0YWJpbGl6ZXMgaXRz
ZWxmLCBzbwogICAgICAgICAgICAvLyBmb3Igbm93IHdlJ2xsIGp1c3Qga2VlcCB0aGluZ3Mgc2lt
cGxlLiBOb3RlIHRoYXQgaWYgd2UgZG9uJ3QKICAgICAgICAgICAgLy8gY2xlYXIgdGhlIHVzZWQg
Yml0IGhlcmUsIHRoZSBiYWNraW5nIHN0b3JlIHRlbmRzIHRvIGluY3JlYXNlCiAgICAgICAgICAg
IC8vIHZlcnkgcXVpY2tseSB0byBpdHMgbWF4aW11bSBzaXplLCBhdCBsZWFzdCB3aXRoIHRoZSBU
ZXh0RmxvdwogICAgICAgICAgICAvLyBkZW1vIHdoZW4gdGhlIHRleHQgaXMgYmVpbmcgY29udGlu
dWFsbHkgcmUtbGFpZCBvdXQuCiAgICAgICAgICAgIGlmIChhdHRlbXB0TnVtYmVyID09IDApIHsK
ICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5l
cnIucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgIkNsZWFyaW5nIHVudXNlZCBlbnRy
aWVzIGluIHByZUV4cGFuZCgpOiBhdHRlbXB0IG51bWJlciAiICsKICAgICAgICAgICAgICAgICAg
ICAgICAgYXR0ZW1wdE51bWJlcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAg
aWYgKGluQmVnaW5FbmRQYWlyKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRHJhdyBhbnkgb3V0
c3RhbmRpbmcgZ2x5cGhzCiAgICAgICAgICAgICAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAg
ICAgIH0KCiAgICAgICAgICAgICAgICBjbGVhclVudXNlZEVudHJpZXMoKTsKCiAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgYWRkaXRpb25GYWlsZWQoUmVjdCBjYXVz
ZSwgaW50IGF0dGVtcHROdW1iZXIpIHsKICAgICAgICAgICAgLy8gSGVhdnkgaGFtbWVyIC0tIG1p
Z2h0IGNvbnNpZGVyIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnQKICAgICAgICAgICAgcGFja2Vy
LmNsZWFyKCk7CiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5jbGVhcigpOwogICAgICAgICAg
ICBtR2x5cGhQcm9kdWNlci5jbGVhckFsbENhY2hlRW50cmllcygpOwoKICAgICAgICAgICAgaWYg
KERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIiAqKiogQ2xlYXJlZCBhbGwgdGV4dCBiZWNhdXNlIGFk
ZGl0aW9uIGZhaWxlZCAqKioiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVi
bGljIHZvaWQgYmVnaW5Nb3ZlbWVudChPYmplY3Qgb2xkQmFja2luZ1N0b3JlLCBPYmplY3QgbmV3
QmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgIC8vIEV4aXQgdGhlIGJlZ2luIC8gZW5kIHBhaXIg
aWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewogICAgICAgICAg
ICAgICAgLy8gRHJhdyBhbnkgb3V0c3RhbmRpbmcgZ2x5cGhzCiAgICAgICAgICAgICAgICBmbHVz
aCgpOwoKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwoKICAgICAg
ICAgICAgICAgIC8vIFBvcCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUgcGlwZWxpbmVk
IHF1YWQgcmVuZGVyZXIKICAgICAgICAgICAgICAgIGdsLmdsUG9wQ2xpZW50QXR0cmliKCk7Cgog
ICAgICAgICAgICAgICAgLy8gVGhlIE9wZW5HTCBzcGVjIGlzIHVuY2xlYXIgYWJvdXQgd2hldGhl
ciB0aGlzIGNoYW5nZXMgdGhlCiAgICAgICAgICAgICAgICAvLyBidWZmZXIgYmluZGluZ3MsIHNv
IHByZWVtcHRpdmVseSB6ZXJvIG91dCB0aGUgR0xfQVJSQVlfQlVGRkVSCiAgICAgICAgICAgICAg
ICAvLyBiaW5kaW5nCgkJCgkJaWYgKGlzVkJPQXZhaWxhYmxlKGdsKSkgewogICAgICAgIAkgICAg
dHJ5IHsKCSAgICAgICAgCSBpZiAoaXNBUkJFeHRlbnNpb25BdmFpbGFibGVfVkJPKSB7CgkJCSAg
ICAgZ2wuZ2xCaW5kQnVmZmVyQVJCKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7CgkJCSB9IGVsc2Ug
ewoJCQkgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJBWV9CVUZGRVIsIDApOyAgIAoJCQkg
fSAgICAgICAgICAgICAgICAKICAgICAgICAJICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAg
ICAgICAgICAgICAgICAJaXNFeHRlbnNpb25BdmFpbGFibGVfVkJPID0gZmFsc2U7CgkJCWlzQVJC
RXh0ZW5zaW9uQXZhaWxhYmxlX1ZCTyA9IGZhbHNlOwogICAgICAgIAkgICAgfQogICAgICAgICAg
ICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpc09ydGhvTW9kZSkgewogICAgICAgICAgICAg
ICAgICAgICgoVGV4dHVyZVJlbmRlcmVyKSBvbGRCYWNraW5nU3RvcmUpLmVuZE9ydGhvUmVuZGVy
aW5nKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICgoVGV4
dHVyZVJlbmRlcmVyKSBvbGRCYWNraW5nU3RvcmUpLmVuZDNEUmVuZGVyaW5nKCk7CiAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBuZXdS
ZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZTsKICAgICAgICAgICAg
ZyA9IG5ld1JlbmRlcmVyLmNyZWF0ZUdyYXBoaWNzKCk7CiAgICAgICAgfQoKICAgICAgICBwdWJs
aWMgdm9pZCBtb3ZlKE9iamVjdCBvbGRCYWNraW5nU3RvcmUsIFJlY3Qgb2xkTG9jYXRpb24sCiAg
ICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbmV3QmFja2luZ1N0b3JlLCBSZWN0IG5ld0xv
Y2F0aW9uKSB7CiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBvbGRSZW5kZXJlciA9IChUZXh0
dXJlUmVuZGVyZXIpIG9sZEJhY2tpbmdTdG9yZTsKICAgICAgICAgICAgVGV4dHVyZVJlbmRlcmVy
IG5ld1JlbmRlcmVyID0gKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlOwoKICAgICAg
ICAgICAgaWYgKG9sZFJlbmRlcmVyID09IG5ld1JlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAv
LyBNb3ZlbWVudCBvbiB0aGUgc2FtZSBiYWNraW5nIHN0b3JlIC0tIGVhc3kgY2FzZQogICAgICAg
ICAgICAgICAgZy5jb3B5QXJlYShvbGRMb2NhdGlvbi54KCksIG9sZExvY2F0aW9uLnkoKSwgb2xk
TG9jYXRpb24udygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2NhdGlvbi5oKCks
IG5ld0xvY2F0aW9uLngoKSAtIG9sZExvY2F0aW9uLngoKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbmV3TG9jYXRpb24ueSgpIC0gb2xkTG9jYXRpb24ueSgpKTsKICAgICAgICAgICAgfSBl
bHNlIHsKICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gZHJhdyBmcm9tIHRoZSBvbGQgcmVuZGVy
ZXIncyBpbWFnZSBpbnRvIHRoZSBuZXcgb25lCiAgICAgICAgICAgICAgICBJbWFnZSBpbWcgPSBv
bGRSZW5kZXJlci5nZXRJbWFnZSgpOwogICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1nLCBu
ZXdMb2NhdGlvbi54KCksIG5ld0xvY2F0aW9uLnkoKSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG5ld0xvY2F0aW9uLngoKSArIG5ld0xvY2F0aW9uLncoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5ld0xvY2F0aW9uLnkoKSArIG5ld0xvY2F0aW9uLmgoKSwgb2xkTG9jYXRpb24u
eCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9jYXRpb24ueSgpLCBvbGRMb2Nh
dGlvbi54KCkgKyBvbGRMb2NhdGlvbi53KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBv
bGRMb2NhdGlvbi55KCkgKyBvbGRMb2NhdGlvbi5oKCksIG51bGwpOwogICAgICAgICAgICB9CiAg
ICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBlbmRNb3ZlbWVudChPYmplY3Qgb2xkQmFja2lu
Z1N0b3JlLCBPYmplY3QgbmV3QmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgIGcuZGlzcG9zZSgp
OwoKICAgICAgICAgICAgLy8gU3luYyB0aGUgd2hvbGUgc3VyZmFjZQogICAgICAgICAgICBUZXh0
dXJlUmVuZGVyZXIgbmV3UmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBuZXdCYWNraW5nU3Rv
cmU7CiAgICAgICAgICAgIG5ld1JlbmRlcmVyLm1hcmtEaXJ0eSgwLCAwLCBuZXdSZW5kZXJlci5n
ZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVuZGVyZXIu
Z2V0SGVpZ2h0KCkpOwoKICAgICAgICAgICAgLy8gUmUtZW50ZXIgdGhlIGJlZ2luIC8gZW5kIHBh
aXIgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewogICAgICAg
ICAgICAgICAgaWYgKGlzT3J0aG9Nb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgKChUZXh0dXJl
UmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZSkuYmVnaW5PcnRob1JlbmRlcmluZyhiZWdpblJlbmRl
cmluZ1dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQsIGJlZ2lu
UmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAg
ICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5iZWdp
bjNEUmVuZGVyaW5nKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gUHVz
aCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUgcGlwZWxpbmVkIHF1YWQgcmVuZGVyZXIK
ICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwogICAgICAgICAgICAg
ICAgZ2wuZ2xQdXNoQ2xpZW50QXR0cmliKChpbnQpIEdMLkdMX0FMTF9DTElFTlRfQVRUUklCX0JJ
VFMpOwoKICAgICAgICAgICAgICAgIGlmIChoYXZlQ2FjaGVkQ29sb3IpIHsKICAgICAgICAgICAg
ICAgICAgICBpZiAoY2FjaGVkQ29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAg
ICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRSLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjYWNoZWRHLCBjYWNoZWRCLCBjYWNoZWRBKTsKICAgICAgICAgICAgICAgICAg
ICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3
QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRDb2xvcik7CiAgICAgICAgICAgICAgICAgICAg
fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAg
bmVlZFRvUmVzZXRDb2xvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cgog
ICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0UmVuZGVyRGVsZWdhdGUgaW1wbGVtZW50cyBS
ZW5kZXJEZWxlZ2F0ZSB7CiAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZW5zaXR5T25seSgpIHsK
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgUmVjdGFu
Z2xlMkQgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAgICAg
ICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJTZXF1
ZW5jZUl0ZXJhdG9yKHN0cikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYyk7CiAg
ICAgICAgfQoKICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKFN0cmluZyBzdHIs
IEZvbnQgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5k
ZXJDb250ZXh0IGZyYykgewogICAgICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3JlYXRl
R2x5cGhWZWN0b3IoZnJjLCBzdHIpLCBmcmMpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIFJl
Y3RhbmdsZTJEIGdldEJvdW5kcyhHbHlwaFZlY3RvciBndiwgRm9udFJlbmRlckNvbnRleHQgZnJj
KSB7CiAgICAgICAgICAgIHJldHVybiBndi5nZXRWaXN1YWxCb3VuZHMoKTsKICAgICAgICB9Cgog
ICAgICAgIHB1YmxpYyB2b2lkIGRyYXdHbHlwaFZlY3RvcihHcmFwaGljczJEIGdyYXBoaWNzLCBH
bHlwaFZlY3RvciBzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4
LCBpbnQgeSkgewogICAgICAgICAgICBncmFwaGljcy5kcmF3R2x5cGhWZWN0b3Ioc3RyLCB4LCB5
KTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3MyRCBncmFwaGlj
cywgU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KSB7CiAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdT
dHJpbmcoc3RyLCB4LCB5KTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAg
ICAvLyBHbHlwaC1ieS1nbHlwaCByZW5kZXJpbmcgc3VwcG9ydAogICAgLy8KCiAgICAvLyBBIHRl
bXBvcmFyeSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBnYXJiYWdlIGNyZWF0aW9uCiAgICBwcml2YXRl
IGNoYXJbXSBzaW5nbGVVbmljb2RlID0gbmV3IGNoYXJbMV07CgogICAgLyoqIEEgR2x5cGggcmVw
cmVzZW50cyBlaXRoZXIgYSBzaW5nbGUgdW5pY29kZSBnbHlwaCBvciBhCiAgICAgICAgc3Vic3Ry
aW5nIG9mIGNoYXJhY3RlcnMgdG8gYmUgZHJhd24uIFRoZSByZWFzb24gZm9yIHRoZSBkdWFsCiAg
ICAgICAgYmVoYXZpb3IgaXMgc28gdGhhdCB3ZSBjYW4gdGFrZSBpbiBhIHNlcXVlbmNlIG9mIHVu
aWNvZGUKICAgICAgICBjaGFyYWN0ZXJzIGFuZCBwYXJ0aXRpb24gdGhlbSBpbnRvIHJ1bnMgb2Yg
aW5kaXZpZHVhbCBnbHlwaHMsCiAgICAgICAgYnV0IGlmIHdlIGVuY291bnRlciBjb21wbGV4IHRl
eHQgYW5kL29yIHVuaWNvZGUgc2VxdWVuY2VzIHdlCiAgICAgICAgZG9uJ3QgdW5kZXJzdGFuZCwg
d2UgY2FuIHJlbmRlciB0aGVtIHVzaW5nIHRoZQogICAgICAgIHN0cmluZy1ieS1zdHJpbmcgbWV0
aG9kLiA8UD4KCiAgICAgICAgR2x5cGhzIG5lZWQgdG8gYmUgYWJsZSB0byByZS11cGxvYWQgdGhl
bXNlbHZlcyB0byB0aGUgYmFja2luZwogICAgICAgIHN0b3JlIG9uIGRlbWFuZCBhcyB3ZSBnbyBh
bG9uZyBpbiB0aGUgcmVuZGVyIHNlcXVlbmNlLgogICAgKi8KCiAgICBjbGFzcyBHbHlwaCB7CiAg
ICAgICAgLy8gSWYgdGhpcyBHbHlwaCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdW5pY29kZSBn
bHlwaCwgdGhpcwogICAgICAgIC8vIGlzIGl0cyB1bmljb2RlIElELiBJZiBpdCByZXByZXNlbnRz
IGEgU3RyaW5nLCB0aGlzIGlzIC0xLgogICAgICAgIHByaXZhdGUgaW50IHVuaWNvZGVJRDsKICAg
ICAgICAvLyBJZiB0aGUgYWJvdmUgZmllbGQgaXNuJ3QgLTEsIHRoZW4gdGhlc2UgZmllbGRzIGFy
ZSB1c2VkLgogICAgICAgIC8vIFRoZSBnbHlwaCBjb2RlIGluIHRoZSBmb250CiAgICAgICAgcHJp
dmF0ZSBpbnQgZ2x5cGhDb2RlOwogICAgICAgIC8vIFRoZSBHbHlwaFByb2R1Y2VyIHdoaWNoIGNy
ZWF0ZWQgdXMKICAgICAgICBwcml2YXRlIEdseXBoUHJvZHVjZXIgcHJvZHVjZXI7CiAgICAgICAg
Ly8gVGhlIGFkdmFuY2Ugb2YgdGhpcyBnbHlwaAogICAgICAgIHByaXZhdGUgZmxvYXQgYWR2YW5j
ZTsKICAgICAgICAvLyBUaGUgR2x5cGhWZWN0b3IgZm9yIHRoaXMgc2luZ2xlIGNoYXJhY3Rlcjsg
dGhpcyBpcyBwYXNzZWQKICAgICAgICAvLyBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGJ1dCBjbGVh
cmVkIGR1cmluZyB0aGUgdXBsb2FkCiAgICAgICAgLy8gcHJvY2VzcwogICAgICAgIHByaXZhdGUg
R2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUdseXBoVmVjdG9yOwogICAgICAgIC8vIFRoZSByZWN0
YW5nbGUgb2YgdGhpcyBnbHlwaCBvbiB0aGUgYmFja2luZyBzdG9yZSwgb3IgbnVsbAogICAgICAg
IC8vIGlmIGl0IGhhcyBiZWVuIGNsZWFyZWQgZHVlIHRvIHNwYWNlIHByZXNzdXJlCiAgICAgICAg
cHJpdmF0ZSBSZWN0IGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nOwogICAgICAgIC8vIElmIHRo
aXMgR2x5cGggcmVwcmVzZW50cyBhIFN0cmluZywgdGhpcyBpcyB0aGUgc2VxdWVuY2Ugb2YKICAg
ICAgICAvLyBjaGFyYWN0ZXJzCiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyOwogICAgICAgIC8v
IFdoZXRoZXIgd2UgbmVlZCBhIHZhbGlkIGFkdmFuY2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBzdHJp
bmcKICAgICAgICAvLyAoaS5lLiwgd2hldGhlciBpdCBoYXMgb3RoZXIgc2luZ2xlIGdseXBocyBj
b21pbmcgYWZ0ZXIgaXQpCiAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRBZHZhbmNlOwoKICAg
ICAgICAvLyBDcmVhdGVzIGEgR2x5cGggcmVwcmVzZW50aW5nIGFuIGluZGl2aWR1YWwgVW5pY29k
ZSBjaGFyYWN0ZXIKICAgICAgICBwdWJsaWMgR2x5cGgoaW50IHVuaWNvZGVJRCwKICAgICAgICAg
ICAgICAgICAgICAgaW50IGdseXBoQ29kZSwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWR2
YW5jZSwKICAgICAgICAgICAgICAgICAgICAgR2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUdseXBo
VmVjdG9yLAogICAgICAgICAgICAgICAgICAgICBHbHlwaFByb2R1Y2VyIHByb2R1Y2VyKSB7CiAg
ICAgICAgICAgIHRoaXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAgICAgICAgICB0aGlzLmds
eXBoQ29kZSA9IGdseXBoQ29kZTsKICAgICAgICAgICAgdGhpcy5hZHZhbmNlID0gYWR2YW5jZTsK
ICAgICAgICAgICAgdGhpcy5zaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IgPSBzaW5nbGVVbmljb2Rl
R2x5cGhWZWN0b3I7CiAgICAgICAgICAgIHRoaXMucHJvZHVjZXIgPSBwcm9kdWNlcjsKICAgICAg
ICB9CgogICAgICAgIC8vIENyZWF0ZXMgYSBHbHlwaCByZXByZXNlbnRpbmcgYSBzZXF1ZW5jZSBv
ZiBjaGFyYWN0ZXJzLCB3aXRoCiAgICAgICAgLy8gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIGFk
ZGl0aW9uYWwgc2luZ2xlIGdseXBocyBhcmUgYmVpbmcKICAgICAgICAvLyByZW5kZXJlZCBhZnRl
ciBpdAogICAgICAgIHB1YmxpYyBHbHlwaChTdHJpbmcgc3RyLCBib29sZWFuIG5lZWRBZHZhbmNl
KSB7CiAgICAgICAgICAgIHRoaXMuc3RyID0gc3RyOwogICAgICAgICAgICB0aGlzLm5lZWRBZHZh
bmNlID0gbmVlZEFkdmFuY2U7CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGlzIGds
eXBoJ3MgdW5pY29kZSBJRCAqLwogICAgICAgIHB1YmxpYyBpbnQgZ2V0VW5pY29kZUlEKCkgewog
ICAgICAgICAgICByZXR1cm4gdW5pY29kZUlEOwogICAgICAgIH0KCiAgICAgICAgLyoqIFJldHVy
bnMgdGhpcyBnbHlwaCdzIChmb250LXNwZWNpZmljKSBnbHlwaCBjb2RlICovCiAgICAgICAgcHVi
bGljIGludCBnZXRHbHlwaENvZGUoKSB7CiAgICAgICAgICAgIHJldHVybiBnbHlwaENvZGU7CiAg
ICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGUgYWR2YW5jZSBmb3IgdGhpcyBnbHlwaCAq
LwogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRBZHZhbmNlKCkgewogICAgICAgICAgICByZXR1cm4g
YWR2YW5jZTsKICAgICAgICB9CgogICAgICAgIC8qKiBEcmF3cyB0aGlzIGdseXBoIGFuZCByZXR1
cm5zIHRoZSAoeCkgYWR2YW5jZSBmb3IgdGhpcyBnbHlwaCAqLwogICAgICAgIHB1YmxpYyBmbG9h
dCBkcmF3M0QoZmxvYXQgaW5YLCBmbG9hdCBpblksIGZsb2F0IHosIGZsb2F0IHNjYWxlRmFjdG9y
KSB7CiAgICAgICAgICAgIGlmIChzdHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgZHJhdzNE
X1JPQlVTVChzdHIsIGluWCwgaW5ZLCB6LCBzY2FsZUZhY3Rvcik7CiAgICAgICAgICAgICAgICBp
ZiAoIW5lZWRBZHZhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGFkdmFu
Y2UgZm9yIHRoaXMgc3RyaW5nCiAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBndiA9IGZvbnQu
Y3JlYXRlR2x5cGhWZWN0b3IoZ2V0Rm9udFJlbmRlckNvbnRleHQoKSwgc3RyKTsKICAgICAgICAg
ICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGd2LmdldE51bUdseXBocygpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB0
b3RhbEFkdmFuY2UgKz0gZ3YuZ2V0R2x5cGhNZXRyaWNzKGkpLmdldEFkdmFuY2UoKTsKICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CiAgICAgICAg
ICAgIH0KCiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNvZGUgcGF0aCB0YWtlbiBmb3IgaW5k
aXZpZHVhbCBnbHlwaHMKICAgICAgICAgICAgaWYgKGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5n
ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHVwbG9hZCgpOwogICAgICAgICAgICB9CgogICAg
ICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKG1QaXBlbGluZWRRdWFkUmVuZGVyZXIg
PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIgPSBu
ZXcgUGlwZWxpbmVkX1F1YWRSZW5kZXJlcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAg
ICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdTdG9yZSgpOwogICAg
ICAgICAgICAgICAgLy8gSGFuZGxlcyBjYXNlIHdoZXJlIE5QT1QgdGV4dHVyZSBpcyB1c2VkIGZv
ciBiYWNraW5nIHN0b3JlCiAgICAgICAgICAgICAgICBUZXh0dXJlQ29vcmRzIHdob2xlSW1hZ2VU
ZXhDb29yZHMgPSByZW5kZXJlci5nZXRUZXh0dXJlKCkuZ2V0SW1hZ2VUZXhDb29yZHMoKTsKICAg
ICAgICAgICAgICAgIGZsb2F0IHhTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMucmlnaHQoKTsK
ICAgICAgICAgICAgICAgIGZsb2F0IHlTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMuYm90dG9t
KCk7CgogICAgICAgICAgICAgICAgUmVjdCByZWN0ID0gZ2x5cGhSZWN0Rm9yVGV4dHVyZU1hcHBp
bmc7CiAgICAgICAgICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRleHREYXRhKSByZWN0LmdldFVz
ZXJEYXRhKCk7CiAgICAgICAgICAgICAgICBkYXRhLm1hcmtVc2VkKCk7CgogICAgICAgICAgICAg
ICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QgPSBkYXRhLm9yaWdSZWN0KCk7CgogICAgICAgICAgICAg
ICAgZmxvYXQgeCA9IGluWCAtIChzY2FsZUZhY3RvciAqIGRhdGEub3JpZ09yaWdpblgoKSk7CiAg
ICAgICAgICAgICAgICBmbG9hdCB5ID0gaW5ZIC0gKHNjYWxlRmFjdG9yICogKChmbG9hdCkgb3Jp
Z1JlY3QuZ2V0SGVpZ2h0KCkgLSBkYXRhLm9yaWdPcmlnaW5ZKCkpKTsKCiAgICAgICAgICAgICAg
ICBpbnQgdGV4dHVyZXggPSByZWN0LngoKSArIChkYXRhLm9yaWdpbigpLnggLSBkYXRhLm9yaWdP
cmlnaW5YKCkpOwogICAgICAgICAgICAgICAgaW50IHRleHR1cmV5ID0gcmVuZGVyZXIuZ2V0SGVp
Z2h0KCkgLSByZWN0LnkoKSAtIChpbnQpIG9yaWdSZWN0LmdldEhlaWdodCgpIC0KICAgICAgICAg
ICAgICAgICAgICAoZGF0YS5vcmlnaW4oKS55IC0gZGF0YS5vcmlnT3JpZ2luWSgpKTsKICAgICAg
ICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIG9yaWdSZWN0LmdldFdpZHRoKCk7CiAgICAgICAg
ICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCk7CgogICAgICAg
ICAgICAgICAgZmxvYXQgdHgxID0geFNjYWxlICogKGZsb2F0KSB0ZXh0dXJleCAvIChmbG9hdCkg
cmVuZGVyZXIuZ2V0V2lkdGgoKTsKICAgICAgICAgICAgICAgIGZsb2F0IHR5MSA9IHlTY2FsZSAq
ICgxLjBmIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KSB0
ZXh0dXJleSAvIChmbG9hdCkgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkpKTsKICAgICAgICAgICAgICAg
IGZsb2F0IHR4MiA9IHhTY2FsZSAqIChmbG9hdCkgKHRleHR1cmV4ICsgd2lkdGgpIC8gKGZsb2F0
KSByZW5kZXJlci5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgZmxvYXQgdHkyID0geVNjYWxl
ICogKDEuMGYgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxvYXQp
ICh0ZXh0dXJleSArIGhlaWdodCkgLyAoZmxvYXQpIHJlbmRlcmVyLmdldEhlaWdodCgpKSk7Cgog
ICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENvb3JkMmYodHgxLCB0
eTEpOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFZlcnRleDNmKHgs
IHksIHopOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENvb3Jk
MmYodHgyLCB0eTEpOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFZl
cnRleDNmKHggKyAod2lkdGggKiBzY2FsZUZhY3RvciksIHksCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeik7CiAgICAgICAgICAgICAgICBtUGlwZWxp
bmVkUXVhZFJlbmRlcmVyLmdsVGV4Q29vcmQyZih0eDIsIHR5Mik7CiAgICAgICAgICAgICAgICBt
UGlwZWxpbmVkUXVhZFJlbmRlcmVyLmdsVmVydGV4M2YoeCArICh3aWR0aCAqIHNjYWxlRmFjdG9y
KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsg
KGhlaWdodCAqIHNjYWxlRmFjdG9yKSwgeik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVh
ZFJlbmRlcmVyLmdsVGV4Q29vcmQyZih0eDEsIHR5Mik7CiAgICAgICAgICAgICAgICBtUGlwZWxp
bmVkUXVhZFJlbmRlcmVyLmdsVmVydGV4M2YoeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB5ICsgKGhlaWdodCAqIHNjYWxlRmFjdG9yKSwgeik7CiAg
ICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBlLnByaW50
U3RhY2tUcmFjZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhZHZhbmNlOwog
ICAgICAgIH0KCiAgICAgICAgLyoqIE5vdGlmaWVzIHRoaXMgZ2x5cGggdGhhdCBpdCdzIGJlZW4g
Y2xlYXJlZCBvdXQgb2YgdGhlIGNhY2hlICovCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7
CiAgICAgICAgICAgIGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nID0gbnVsbDsKICAgICAgICB9
CgogICAgICAgIHByaXZhdGUgdm9pZCB1cGxvYWQoKSB7CiAgICAgICAgICAgIEdseXBoVmVjdG9y
IGd2ID0gZ2V0R2x5cGhWZWN0b3IoKTsKICAgICAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ0JCb3gg
PSBwcmVOb3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKGd2LCBnZXRGb250UmVuZGVy
Q29udGV4dCgpKSk7CiAgICAgICAgICAgIFJlY3RhbmdsZTJEIGJib3ggPSBub3JtYWxpemUob3Jp
Z0JCb3gpOwogICAgICAgICAgICBQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQoKGludCkgLWJib3gu
Z2V0TWluWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgLWJi
b3guZ2V0TWluWSgpKTsKICAgICAgICAgICAgUmVjdCByZWN0ID0gbmV3IFJlY3QoMCwgMCwgKGlu
dCkgYmJveC5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50
KSBiYm94LmdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcg
VGV4dERhdGEobnVsbCwgb3JpZ2luLCBvcmlnQkJveCwgdW5pY29kZUlEKSk7CiAgICAgICAgICAg
IHBhY2tlci5hZGQocmVjdCk7CiAgICAgICAgICAgIGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5n
ID0gcmVjdDsKICAgICAgICAgICAgR3JhcGhpY3MyRCBnID0gZ2V0R3JhcGhpY3MyRCgpOwogICAg
ICAgICAgICAvLyBPSywgc2hvdWxkIG5vdyBoYXZlIGFuICh4LCB5KSBmb3IgdGhpcyByZWN0YW5n
bGU7IHJhc3Rlcml6ZQogICAgICAgICAgICAvLyB0aGUgZ2x5cGgKICAgICAgICAgICAgaW50IHN0
cnggPSByZWN0LngoKSArIG9yaWdpbi54OwogICAgICAgICAgICBpbnQgc3RyeSA9IHJlY3QueSgp
ICsgb3JpZ2luLnk7CgogICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGFyZWEgd2UncmUgZ29p
bmcgdG8gZHJhdyBpbnRvCiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRl
LkNsZWFyKTsKICAgICAgICAgICAgZy5maWxsUmVjdChyZWN0LngoKSwgcmVjdC55KCksIHJlY3Qu
dygpLCByZWN0LmgoKSk7CiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRl
LlNyYyk7CgogICAgICAgICAgICAvLyBEcmF3IHRoZSBzdHJpbmcKICAgICAgICAgICAgcmVuZGVy
RGVsZWdhdGUuZHJhd0dseXBoVmVjdG9yKGcsIGd2LCBzdHJ4LCBzdHJ5KTsKCiAgICAgICAgICAg
IGlmIChEUkFXX0JCT1hFUykgewogICAgICAgICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0
RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwogICAgICAgICAgICAgICAgLy8gRHJhdyBhIGJvdW5k
aW5nIGJveCBvbiB0aGUgYmFja2luZyBzdG9yZQogICAgICAgICAgICAgICAgZy5kcmF3UmVjdChz
dHJ4IC0gZGF0YS5vcmlnT3JpZ2luWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ5
IC0gZGF0YS5vcmlnT3JpZ2luWSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBk
YXRhLm9yaWdSZWN0KCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlu
dCkgZGF0YS5vcmlnUmVjdCgpLmdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgIGcuZHJhd1Jl
Y3Qoc3RyeCAtIGRhdGEub3JpZ2luKCkueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ry
eSAtIGRhdGEub3JpZ2luKCkueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53KCks
CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICAgICAgfQoKICAg
ICAgICAgICAgLy8gTWFyayB0aGlzIHJlZ2lvbiBvZiB0aGUgVGV4dHVyZVJlbmRlcmVyIGFzIGRp
cnR5CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eShyZWN0LngoKSwgcmVj
dC55KCksIHJlY3QudygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmVjdC5oKCkpOwogICAgICAgICAgICAvLyBSZS1yZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCBvdXIg
cHJvZHVjZXIKICAgICAgICAgICAgcHJvZHVjZXIucmVnaXN0ZXIodGhpcyk7CiAgICAgICAgfQoK
ICAgICAgICBwcml2YXRlIEdseXBoVmVjdG9yIGdldEdseXBoVmVjdG9yKCkgewogICAgICAgICAg
ICBHbHlwaFZlY3RvciBndiA9IHNpbmdsZVVuaWNvZGVHbHlwaFZlY3RvcjsKICAgICAgICAgICAg
aWYgKGd2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHNpbmdsZVVuaWNvZGVHbHlwaFZlY3Rv
ciA9IG51bGw7IC8vIERvbid0IG5lZWQgdGhpcyBhbnltb3JlCiAgICAgICAgICAgICAgICByZXR1
cm4gZ3Y7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IChjaGFy
KSB1bmljb2RlSUQ7CiAgICAgICAgICAgIHJldHVybiBmb250LmNyZWF0ZUdseXBoVmVjdG9yKGdl
dEZvbnRSZW5kZXJDb250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgIH0KICAgIH0KCiAg
ICBjbGFzcyBHbHlwaFByb2R1Y2VyIHsKICAgICAgICBmaW5hbCBpbnQgdW5kZWZpbmVkID0gLTI7
CiAgICAgICAgRm9udFJlbmRlckNvbnRleHQgZm9udFJlbmRlckNvbnRleHQ7CiAgICAgICAgTGlz
dC8qPEdseXBoPiovIGdseXBoc091dHB1dCA9IG5ldyBBcnJheUxpc3QvKjxHbHlwaD4qLygpOwog
ICAgICAgIC8vIFRoZSBtYXBwaW5nIGZyb20gdW5pY29kZSBjaGFyYWN0ZXIgdG8gZm9udC1zcGVj
aWZpYyBnbHlwaCBJRAogICAgICAgIGludFtdIHVuaWNvZGVzMkdseXBoczsKICAgICAgICAvLyBU
aGUgbWFwcGluZyBmcm9tIGdseXBoIElEIHRvIEdseXBoCiAgICAgICAgR2x5cGhbXSBnbHlwaENh
Y2hlOwogICAgICAgIC8vIFdlIHJlLXVzZSB0aGlzIGZvciBlYWNoIGluY29taW5nIHN0cmluZwog
ICAgICAgIENoYXJTZXF1ZW5jZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQ2hhclNlcXVlbmNlSXRlcmF0
b3IoKTsKCiAgICAgICAgR2x5cGhQcm9kdWNlcihpbnQgZm9udExlbmd0aEluR2x5cGhzKSB7CiAg
ICAgICAgICAgIHVuaWNvZGVzMkdseXBocyA9IG5ldyBpbnRbNTEyXTsKICAgICAgICAgICAgZ2x5
cGhDYWNoZSA9IG5ldyBHbHlwaFtmb250TGVuZ3RoSW5HbHlwaHNdOwogICAgICAgICAgICBjbGVh
ckFsbENhY2hlRW50cmllcygpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExpc3QvKjxHbHlw
aD4qLyBnZXRHbHlwaHMoQ2hhclNlcXVlbmNlIGluU3RyaW5nKSB7CiAgICAgICAgICAgIGdseXBo
c091dHB1dC5jbGVhcigpOwogICAgICAgICAgICBpdGVyLmluaXRGcm9tQ2hhclNlcXVlbmNlKGlu
U3RyaW5nKTsKICAgICAgICAgICAgR2x5cGhWZWN0b3IgZnVsbFJ1bkdseXBoVmVjdG9yID0gZm9u
dC5jcmVhdGVHbHlwaFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0
ZXIpOwogICAgICAgICAgICBib29sZWFuIGNvbXBsZXggPSAoZnVsbFJ1bkdseXBoVmVjdG9yLmdl
dExheW91dEZsYWdzKCkgIT0gMCk7CiAgICAgICAgICAgIGlmIChjb21wbGV4IHx8IERJU0FCTEVf
R0xZUEhfQ0FDSEUpIHsKICAgICAgICAgICAgICAgIC8vIFB1bnQgdG8gdGhlIHJvYnVzdCB2ZXJz
aW9uIG9mIHRoZSByZW5kZXJlcgogICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFkZChuZXcg
R2x5cGgoaW5TdHJpbmcudG9TdHJpbmcoKSwgZmFsc2UpKTsKICAgICAgICAgICAgICAgIHJldHVy
biBnbHlwaHNPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBsZW5ndGhJbkds
eXBocyA9IGZ1bGxSdW5HbHlwaFZlY3Rvci5nZXROdW1HbHlwaHMoKTsKICAgICAgICAgICAgaW50
IGkgPSAwOwogICAgICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aEluR2x5cGhzKSB7CiAgICAgICAg
ICAgICAgICBHbHlwaCBnbHlwaCA9IGdldEdseXBoKGluU3RyaW5nLCBmdWxsUnVuR2x5cGhWZWN0
b3IsIGkpOwogICAgICAgICAgICAgICAgaWYgKGdseXBoICE9IG51bGwpIHsKICAgICAgICAgICAg
ICAgICAgICBnbHlwaHNPdXRwdXQuYWRkKGdseXBoKTsKICAgICAgICAgICAgICAgICAgICBpKys7
CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEFzc2VtYmxl
IGEgcnVuIG9mIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBmaXQgaW4KICAgICAgICAgICAgICAgICAg
ICAvLyB0aGUgY2FjaGUKICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3
IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoSW5H
bHlwaHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R2x5cGgoaW5TdHJpbmcsIGZ1
bGxSdW5HbHlwaFZlY3RvciwgaSkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBi
dWYuYXBwZW5kKGluU3RyaW5nLmNoYXJBdChpKyspKTsKICAgICAgICAgICAgICAgICAgICB9CiAg
ICAgICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFkZChuZXcgR2x5cGgoYnVmLnRvU3RyaW5n
KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW55
IG1vcmUgZ2x5cGhzIGFmdGVyIHRoaXMgcnVuPwogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGkgPCBsZW5ndGhJbkdseXBocykpOwogICAgICAgICAgICAgICAg
fQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBnbHlwaHNPdXRwdXQ7CiAgICAgICAg
fQoKICAgICAgICBwdWJsaWMgdm9pZCBjbGVhckNhY2hlRW50cnkoaW50IHVuaWNvZGVJRCkgewog
ICAgICAgICAgICBpbnQgZ2x5cGhJRCA9IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwogICAg
ICAgICAgICBpZiAoZ2x5cGhJRCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIEdseXBo
IGdseXBoID0gZ2x5cGhDYWNoZVtnbHlwaElEXTsKICAgICAgICAgICAgICAgIGlmIChnbHlwaCAh
PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZ2x5cGguY2xlYXIoKTsKICAgICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgICAgIGdseXBoQ2FjaGVbZ2x5cGhJRF0gPSBudWxsOwogICAgICAg
ICAgICB9CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdID0gdW5kZWZpbmVk
OwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBbGxDYWNoZUVudHJpZXMoKSB7
CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pY29kZXMyR2x5cGhzLmxlbmd0aDsg
aSsrKSB7CiAgICAgICAgICAgICAgICBjbGVhckNhY2hlRW50cnkoaSk7CiAgICAgICAgICAgIH0K
ICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEdseXBoIGdseXBoKSB7CiAg
ICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1tnbHlwaC5nZXRVbmljb2RlSUQoKV0gPSBnbHlwaC5n
ZXRHbHlwaENvZGUoKTsKICAgICAgICAgICAgZ2x5cGhDYWNoZVtnbHlwaC5nZXRHbHlwaENvZGUo
KV0gPSBnbHlwaDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRHbHlwaFBpeGVs
V2lkdGgoY2hhciB1bmljb2RlSUQpIHsKICAgICAgICAgICAgR2x5cGggZ2x5cGggPSBnZXRHbHlw
aCh1bmljb2RlSUQpOwogICAgICAgICAgICBpZiAoZ2x5cGggIT0gbnVsbCkgewogICAgICAgICAg
ICAgICAgcmV0dXJuIGdseXBoLmdldEFkdmFuY2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAg
ICAgLy8gSGF2ZSB0byBkbyB0aGlzIHRoZSBoYXJkIC8gdW5jYWNoZWQgd2F5CiAgICAgICAgICAg
IHNpbmdsZVVuaWNvZGVbMF0gPSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2
ID0gZm9udC5jcmVhdGVHbHlwaFZlY3Rvcihmb250UmVuZGVyQ29udGV4dCwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
aW5nbGVVbmljb2RlKTsKICAgICAgICAgICAgcmV0dXJuIGd2LmdldEdseXBoTWV0cmljcygwKS5n
ZXRBZHZhbmNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm5zIGEgZ2x5cGggb2JqZWN0
IGZvciB0aGlzIHNpbmdsZSBnbHlwaC4gUmV0dXJucyBudWxsCiAgICAgICAgLy8gaWYgdGhlIHVu
aWNvZGUgb3IgZ2x5cGggSUQgd291bGQgYmUgb3V0IG9mIGJvdW5kcyBvZiB0aGUKICAgICAgICAv
LyBnbHlwaCBjYWNoZS4KICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKENoYXJTZXF1ZW5j
ZSBpblN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoVmVjdG9yIGZ1
bGxSdW5HbHlwaFZlY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRl
eCkgewogICAgICAgICAgICBjaGFyIHVuaWNvZGVJRCA9IGluU3RyaW5nLmNoYXJBdChpbmRleCk7
CgogICAgICAgICAgICBpZiAodW5pY29kZUlEID49IHVuaWNvZGVzMkdseXBocy5sZW5ndGgpIHsK
ICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBp
bnQgZ2x5cGhJRCA9IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwogICAgICAgICAgICBpZiAo
Z2x5cGhJRCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnbHlwaENhY2hl
W2dseXBoSURdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNdXN0IGZhYnJpY2F0ZSB0
aGUgZ2x5cGgKICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IHVuaWNvZGVJRDsKICAgICAg
ICAgICAgR2x5cGhWZWN0b3IgZ3YgPSBmb250LmNyZWF0ZUdseXBoVmVjdG9yKGdldEZvbnRSZW5k
ZXJDb250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgICAgICByZXR1cm4gZ2V0R2x5cGgo
dW5pY29kZUlELCBndiwgZnVsbFJ1bkdseXBoVmVjdG9yLmdldEdseXBoTWV0cmljcyhpbmRleCkp
OwogICAgICAgIH0KCiAgICAgICAgLy8gSXQncyB1bmNsZWFyIHdoZXRoZXIgdGhpcyB2YXJpYW50
IG1pZ2h0IHByb2R1Y2UgbGVzcwogICAgICAgIC8vIG9wdGltYWwgcmVzdWx0cyB0aGFuIGlmIHdl
IGNhbiBzZWUgdGhlIGVudGlyZSBHbHlwaFZlY3RvcgogICAgICAgIC8vIGZvciB0aGUgaW5jb21p
bmcgc3RyaW5nCiAgICAgICAgcHJpdmF0ZSBHbHlwaCBnZXRHbHlwaChpbnQgdW5pY29kZUlEKSB7
CiAgICAgICAgICAgIGlmICh1bmljb2RlSUQgPj0gdW5pY29kZXMyR2x5cGhzLmxlbmd0aCkgewog
ICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlu
dCBnbHlwaElEID0gdW5pY29kZXMyR2x5cGhzW3VuaWNvZGVJRF07CiAgICAgICAgICAgIGlmIChn
bHlwaElEICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGdseXBoQ2FjaGVb
Z2x5cGhJRF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IChj
aGFyKSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZm9udC5jcmVhdGVH
bHlwaFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLCBzaW5nbGVVbmljb2RlKTsKICAgICAg
ICAgICAgcmV0dXJuIGdldEdseXBoKHVuaWNvZGVJRCwgZ3YsIGd2LmdldEdseXBoTWV0cmljcygw
KSk7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKGludCB1bmljb2Rl
SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBzaW5nbGVVbmlj
b2RlR2x5cGhWZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaE1ldHJp
Y3MgbWV0cmljcykgewogICAgICAgICAgICBpbnQgZ2x5cGhDb2RlID0gc2luZ2xlVW5pY29kZUds
eXBoVmVjdG9yLmdldEdseXBoQ29kZSgwKTsKICAgICAgICAgICAgLy8gSGF2ZSBzZWVuIGh1Z2Ug
Z2x5cGggY29kZXMgKDY1NTM2KSBjb21pbmcgb3V0IG9mIHNvbWUgZm9udHMgaW4gc29tZSBVbmlj
b2RlIHNpdHVhdGlvbnMKICAgICAgICAgICAgaWYgKGdseXBoQ29kZSA+PSBnbHlwaENhY2hlLmxl
bmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAg
ICAgICAgR2x5cGggZ2x5cGggPSBuZXcgR2x5cGgodW5pY29kZUlELAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBnbHlwaENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1ldHJpY3MuZ2V0QWR2YW5jZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHRoaXMpOwogICAgICAgICAgICByZWdpc3RlcihnbHlwaCk7CiAgICAg
ICAgICAgIHJldHVybiBnbHlwaDsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgUGlwZWxpbmVk
X1F1YWRSZW5kZXJlciB7CiAgICAgICAgaW50IG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlw
ZWxpbmUgPSAwOwogICAgICAgIEZsb2F0QnVmZmVyIG1UZXhDb29yZHM7CiAgICAgICAgRmxvYXRC
dWZmZXIgbVZlcnRDb29yZHM7CiAgICAgICAgYm9vbGVhbiB1c2luZ1ZCT3M7CiAgICAgICAgaW50
IG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2VzOwogICAgICAgIGludCBtVkJPX0Zvcl9SZXN1
YWJsZVRpbGVUZXhDb29yZHM7CgogICAgICAgIFBpcGVsaW5lZF9RdWFkUmVuZGVyZXIoKSB7CiAg
ICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwogICAgICAgICAgICBtVmVydENv
b3JkcyA9IEJ1ZmZlclV0aWwubmV3RmxvYXRCdWZmZXIoa1RvdGFsQnVmZmVyU2l6ZUNvb3Jkc1Zl
cnRzKTsKICAgICAgICAgICAgbVRleENvb3JkcyA9IEJ1ZmZlclV0aWwubmV3RmxvYXRCdWZmZXIo
a1RvdGFsQnVmZmVyU2l6ZUNvb3Jkc1RleCk7CgogICAgICAgICAgICB1c2luZ1ZCT3MgPSBpc1ZC
T0F2YWlsYWJsZShnbCk7CgogICAgICAgICAgICBpZiAodXNpbmdWQk9zKSB7CiAgICAgICAgICAg
ICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGludFtdIHZib3MgPSBuZXcgaW50WzJdOwoJ
CSAgICBpZiAoaXNBUkJFeHRlbnNpb25BdmFpbGFibGVfVkJPKSB7CiAgICAgICAgICAgICAgICAg
ICAgICAgIGdsLmdsR2VuQnVmZmVyc0FSQigyLCBJbnRCdWZmZXIud3JhcCh2Ym9zKSk7CgkgICAg
ICAgICAgICB9IGVsc2UgewoJCSAgICAgICAgZ2wuZ2xHZW5CdWZmZXJzKDIsIEludEJ1ZmZlci53
cmFwKHZib3MpKTsKCQkgICAgfQoKICAgICAgICAgICAgICAgICAgICBtVkJPX0Zvcl9SZXN1YWJs
ZVRpbGVWZXJ0aWNlcyA9IHZib3NbMF07CiAgICAgICAgICAgICAgICAgICAgbVZCT19Gb3JfUmVz
dWFibGVUaWxlVGV4Q29vcmRzID0gdmJvc1sxXTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGlz
QVJCRXh0ZW5zaW9uQXZhaWxhYmxlX1ZCTykgewoJCSAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyQVJC
KEdMLkdMX0FSUkFZX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bVZCT19Gb3JfUmVzdWFibGVUaWxlVmVydGljZXMpOwogICAgICAgICAgICAgICAgCWdsLmdsQnVm
ZmVyRGF0YUFSQihHTC5HTF9BUlJBWV9CVUZGRVIsIGtUb3RhbEJ1ZmZlclNpemVCeXRlc1ZlcnRz
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAludWxsLCBHTC5HTF9TVFJFQU1fRFJB
Vyk7IC8vIHN0cmVhbSBkcmF3IGJlY2F1c2UgdGhpcyBpcyBhIHNpbmdsZSBxdWFkIHVzZSBwaXBl
bGluZQoKICAgICAgICAgICAgICAgIAlnbC5nbEJpbmRCdWZmZXJBUkIoR0wuR0xfQVJSQVlfQlVG
RkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAltVkJPX0Zvcl9SZXN1YWJsZVRp
bGVUZXhDb29yZHMpOwogICAgICAgICAgICAgICAgCWdsLmdsQnVmZmVyRGF0YUFSQihHTC5HTF9B
UlJBWV9CVUZGRVIsIGtUb3RhbEJ1ZmZlclNpemVCeXRlc1RleCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAJbnVsbCwgR0wuR0xfU1RSRUFNX0RSQVcpOyAvLyBzdHJlYW0gZHJhdyBi
ZWNhdXNlIHRoaXMgaXMgYSBzaW5nbGUgcXVhZCB1c2UgcGlwZWxpbmUKCQkgICAgfSBlbHNlIHsK
CQkgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJBWV9CVUZGRVIsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2VzKTsK
ICAgICAgICAgICAgICAgIAlnbC5nbEJ1ZmZlckRhdGEoR0wuR0xfQVJSQVlfQlVGRkVSLCBrVG90
YWxCdWZmZXJTaXplQnl0ZXNWZXJ0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJ
bnVsbCwgR0wuR0xfU1RSRUFNX0RSQVcpOyAvLyBzdHJlYW0gZHJhdyBiZWNhdXNlIHRoaXMgaXMg
YSBzaW5nbGUgcXVhZCB1c2UgcGlwZWxpbmUKCiAgICAgICAgICAgICAgICAJZ2wuZ2xCaW5kQnVm
ZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJ
bVZCT19Gb3JfUmVzdWFibGVUaWxlVGV4Q29vcmRzKTsKICAgICAgICAgICAgICAgIAlnbC5nbEJ1
ZmZlckRhdGEoR0wuR0xfQVJSQVlfQlVGRkVSLCBrVG90YWxCdWZmZXJTaXplQnl0ZXNUZXgsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCW51bGwsIEdMLkdMX1NUUkVBTV9EUkFXKTsg
Ly8gc3RyZWFtIGRyYXcgYmVjYXVzZSB0aGlzIGlzIGEgc2luZ2xlIHF1YWQgdXNlIHBpcGVsaW5l
CgkJICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4
Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgaXNFeHRlbnNpb25BdmFpbGFibGVfVkJP
ID0gZmFsc2U7CgkJICAgIGlzQVJCRXh0ZW5zaW9uQXZhaWxhYmxlX1ZCTyA9IGZhbHNlOwogICAg
ICAgICAgICAgICAgICAgIHVzaW5nVkJPcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAg
ICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBnbFRleENvb3JkMmYoZmxv
YXQgdiwgZmxvYXQgdjEpIHsKICAgICAgICAgICAgbVRleENvb3Jkcy5wdXQodik7CiAgICAgICAg
ICAgIG1UZXhDb29yZHMucHV0KHYxKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIGds
VmVydGV4M2YoZmxvYXQgaW5YLCBmbG9hdCBpblksIGZsb2F0IGluWikgewogICAgICAgICAgICBt
VmVydENvb3Jkcy5wdXQoaW5YKTsKICAgICAgICAgICAgbVZlcnRDb29yZHMucHV0KGluWSk7CiAg
ICAgICAgICAgIG1WZXJ0Q29vcmRzLnB1dChpblopOwoKICAgICAgICAgICAgbU91dHN0YW5kaW5n
R2x5cGhzVmVydGljZXNQaXBlbGluZSsrOwoKICAgICAgICAgICAgaWYgKG1PdXRzdGFuZGluZ0ds
eXBoc1ZlcnRpY2VzUGlwZWxpbmUgPj0ga1RvdGFsQnVmZmVyU2l6ZVZlcnRzKSB7CiAgICAgICAg
ICAgICAgICB0aGlzLmRyYXcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHJp
dmF0ZSB2b2lkIGRyYXcoKSB7CiAgICAgICAgICAgIGlmICh1c2VWZXJ0ZXhBcnJheXMpIHsKICAg
ICAgICAgICAgICAgIGRyYXdWZXJ0ZXhBcnJheXMoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAg
ICAgICAgICAgICAgIGRyYXdJTU1FRElBVEUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAg
ICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdWZXJ0ZXhBcnJheXMoKSB7CiAgICAgICAgICAgIGlmICht
T3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lID4gMCkgewogICAgICAgICAgICAgICAg
R0wgZ2wgPSBHTFUuZ2V0Q3VycmVudEdMKCk7CgogICAgICAgICAgICAgICAgVGV4dHVyZVJlbmRl
cmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CiAgICAgICAgICAgICAgICBUZXh0dXJl
IHRleHR1cmUgPSByZW5kZXJlci5nZXRUZXh0dXJlKCk7IC8vIHRyaWdnZXJzIHRleHR1cmUgdXBs
b2Fkcy4gIE1heWJlIHRoaXMgc2hvdWxkIGJlIG1vcmUgb2J2aW91cz8KCiAgICAgICAgICAgICAg
ICBtVmVydENvb3Jkcy5yZXdpbmQoKTsKICAgICAgICAgICAgICAgIG1UZXhDb29yZHMucmV3aW5k
KCk7CgogICAgICAgICAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTC5HTF9WRVJURVhf
QVJSQVkpOwoKICAgICAgICAgICAgICAgIGlmICh1c2luZ1ZCT3MpIHsKCQkgICAgaWYgKGlzQVJC
RXh0ZW5zaW9uQXZhaWxhYmxlX1ZCTykgewoJCSAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyQVJCKEdM
LkdMX0FSUkFZX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZC
T19Gb3JfUmVzdWFibGVUaWxlVmVydGljZXMpOwogICAgICAgICAgICAgICAgCWdsLmdsQnVmZmVy
U3ViRGF0YUFSQihHTC5HTF9BUlJBWV9CVUZGRVIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgCSAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgKiBrU2l6ZUlu
Qnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAJICAgbVZlcnRDb29yZHMpOyAvLyB1cGxvYWQgb25seSB0aGUgbmV3IHN0dWZmCgkJICAg
IH0gZWxzZSB7CgkJICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wuR0xfQVJSQVlfQlVGRkVSLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVW
ZXJ0aWNlcyk7CiAgICAgICAgICAgICAgICAJZ2wuZ2xCdWZmZXJTdWJEYXRhKEdMLkdMX0FSUkFZ
X0JVRkZFUiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgbU91dHN0YW5k
aW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSAqIGtTaXplSW5CeXRlc19PbmVWZXJ0aWNlc19WZXJ0
ZXhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICBtVmVydENvb3Jkcyk7
IC8vIHVwbG9hZCBvbmx5IHRoZSBuZXcgc3R1ZmYKCQkgICAgfQogICAgICAgICAgICAgICAgICAg
IAogICAgICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4UG9pbnRlcigzLCBHTC5HTF9GTE9BVCwg
MCwgMCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsLmds
VmVydGV4UG9pbnRlcigzLCBHTC5HTF9GTE9BVCwgMCwgbVZlcnRDb29yZHMpOwogICAgICAgICAg
ICAgICAgfQoKICAgICAgICAgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoR0wuR0xfVEVY
VFVSRV9DT09SRF9BUlJBWSk7CgogICAgICAgICAgICAgICAgaWYgKHVzaW5nVkJPcykgewoJCSAg
ICBpZiAoaXNBUkJFeHRlbnNpb25BdmFpbGFibGVfVkJPKSB7CgkJICAgICAgICBnbC5nbEJpbmRC
dWZmZXJBUkIoR0wuR0xfQVJSQVlfQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVUZXhDb29yZHMpOwogICAgICAgICAgICAgICAg
CWdsLmdsQnVmZmVyU3ViRGF0YUFSQihHTC5HTF9BUlJBWV9CVUZGRVIsIDAsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgCSAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxp
bmUgKiBrU2l6ZUluQnl0ZXNfT25lVmVydGljZXNfVGV4RGF0YSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAJICAgbVRleENvb3Jkcyk7IC8vIHVwbG9hZCBvbmx5IHRoZSBuZXcgc3R1
ZmYKCQkgICAgfSBlbHNlIHsKCQkgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJBWV9C
VUZGRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3Vh
YmxlVGlsZVRleENvb3Jkcyk7CiAgICAgICAgICAgICAgICAJZ2wuZ2xCdWZmZXJTdWJEYXRhKEdM
LkdMX0FSUkFZX0JVRkZFUiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAg
bU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSAqIGtTaXplSW5CeXRlc19PbmVWZXJ0
aWNlc19UZXhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICBtVGV4Q29v
cmRzKTsgLy8gdXBsb2FkIG9ubHkgdGhlIG5ldyBzdHVmZgoJCSAgICB9ICAgICAgICAgICAgICAK
ICAgICAgICAgICAgICAgICAgICBnbC5nbFRleENvb3JkUG9pbnRlcigyLCBHTC5HTF9GTE9BVCwg
MCwgMCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsLmds
VGV4Q29vcmRQb2ludGVyKDIsIEdMLkdMX0ZMT0FULCAwLCBtVGV4Q29vcmRzKTsKICAgICAgICAg
ICAgICAgIH0KCiAgICAgICAgICAgICAgICBnbC5nbERyYXdBcnJheXMoR0wuR0xfUVVBRFMsIDAs
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHN0YW5kaW5nR2x5cGhzVmVydGlj
ZXNQaXBlbGluZSk7CgogICAgICAgICAgICAgICAgbVZlcnRDb29yZHMucmV3aW5kKCk7CiAgICAg
ICAgICAgICAgICBtVGV4Q29vcmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAgbU91dHN0YW5k
aW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9Cgog
ICAgICAgIHByaXZhdGUgdm9pZCBkcmF3SU1NRURJQVRFKCkgewogICAgICAgICAgICBpZiAobU91
dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSA+IDApIHsKICAgICAgICAgICAgICAgIFRl
eHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdTdG9yZSgpOwogICAgICAgICAgICAg
ICAgVGV4dHVyZSB0ZXh0dXJlID0gcmVuZGVyZXIuZ2V0VGV4dHVyZSgpOyAvLyB0cmlnZ2VycyB0
ZXh0dXJlIHVwbG9hZHMuICBNYXliZSB0aGlzIHNob3VsZCBiZSBtb3JlIG9idmlvdXM/CgogICAg
ICAgICAgICAgICAgR0wgZ2wgPSBHTFUuZ2V0Q3VycmVudEdMKCk7CiAgICAgICAgICAgICAgICBn
bC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAg
ICAgICAgICAgIGludCBudW1iZXJPZlF1YWRzID0gbU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQ
aXBlbGluZSAvIDQ7CiAgICAgICAgICAgICAgICAgICAgbVZlcnRDb29yZHMucmV3aW5kKCk7CiAg
ICAgICAgICAgICAgICAgICAgbVRleENvb3Jkcy5yZXdpbmQoKTsKCiAgICAgICAgICAgICAgICAg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlF1YWRzOyBpKyspIHsKICAgICAgICAgICAg
ICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZDJmKG1UZXhDb29yZHMuZ2V0KCksIG1UZXhDb29yZHMu
Z2V0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBnbC5nbFZlcnRleDNmKG1WZXJ0Q29vcmRz
LmdldCgpLCBtVmVydENvb3Jkcy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtVmVydENvb3Jkcy5nZXQoKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBnbC5n
bFRleENvb3JkMmYobVRleENvb3Jkcy5nZXQoKSwgbVRleENvb3Jkcy5nZXQoKSk7CiAgICAgICAg
ICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4M2YobVZlcnRDb29yZHMuZ2V0KCksIG1WZXJ0Q29v
cmRzLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZXJ0Q29v
cmRzLmdldCgpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4Q29vcmQyZihtVGV4
Q29vcmRzLmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAg
Z2wuZ2xWZXJ0ZXgzZihtVmVydENvb3Jkcy5nZXQoKSwgbVZlcnRDb29yZHMuZ2V0KCksCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlcnRDb29yZHMuZ2V0KCkpOwoKICAg
ICAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZDJmKG1UZXhDb29yZHMuZ2V0KCksIG1U
ZXhDb29yZHMuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBnbC5nbFZlcnRleDNmKG1W
ZXJ0Q29vcmRzLmdldCgpLCBtVmVydENvb3Jkcy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAg
fQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAg
ICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAg
ICAgICAgICAgICAgICAgICBnbC5nbEVuZCgpOwogICAgICAgICAgICAgICAgICAgIG1WZXJ0Q29v
cmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgIG1UZXhDb29yZHMucmV3aW5kKCk7CiAg
ICAgICAgICAgICAgICAgICAgbU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSA9IDA7
CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgY2xh
c3MgRGVidWdMaXN0ZW5lciBpbXBsZW1lbnRzIEdMRXZlbnRMaXN0ZW5lciB7CiAgICAgICAgcHJp
dmF0ZSBHTFUgZ2x1ID0gbmV3IEdMVSgpOwogICAgICAgIHByaXZhdGUgRnJhbWUgZnJhbWU7Cgog
ICAgICAgIERlYnVnTGlzdGVuZXIoRnJhbWUgZnJhbWUpIHsKICAgICAgICAgICAgdGhpcy5mcmFt
ZSA9IGZyYW1lOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgZGlzcGxheShHTEF1dG9E
cmF3YWJsZSBkcmF3YWJsZSkgewogICAgICAgICAgICBHTCBnbCA9IGRyYXdhYmxlLmdldEdMKCk7
CiAgICAgICAgICAgIGdsLmdsQ2xlYXIoR0wuR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMLkdMX0NP
TE9SX0JVRkZFUl9CSVQpOwoKICAgICAgICAgICAgaWYgKHBhY2tlciA9PSBudWxsKSB7CiAgICAg
ICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRleHR1cmVSZW5k
ZXJlciByZW5kID0gZ2V0QmFja2luZ1N0b3JlKCk7CiAgICAgICAgICAgIGZpbmFsIGludCB3ID0g
cmVuZC5nZXRXaWR0aCgpOwogICAgICAgICAgICBmaW5hbCBpbnQgaCA9IHJlbmQuZ2V0SGVpZ2h0
KCk7CiAgICAgICAgICAgIHJlbmQuYmVnaW5PcnRob1JlbmRlcmluZyh3LCBoKTsKICAgICAgICAg
ICAgcmVuZC5kcmF3T3J0aG9SZWN0KDAsIDApOwogICAgICAgICAgICByZW5kLmVuZE9ydGhvUmVu
ZGVyaW5nKCk7CgogICAgICAgICAgICBpZiAoKGZyYW1lLmdldFdpZHRoKCkgIT0gdykgfHwgKGZy
YW1lLmdldEhlaWdodCgpICE9IGgpKSB7CiAgICAgICAgICAgICAgICBFdmVudFF1ZXVlLmludm9r
ZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZv
aWQgcnVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuc2V0U2l6ZSh3LCBo
KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAg
ICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBVbnVzZWQgbWV0aG9kcwogICAgICAgIHB1
YmxpYyB2b2lkIGluaXQoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUpIHsKICAgICAgICB9CgogICAg
ICAgIHB1YmxpYyB2b2lkIHJlc2hhcGUoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUsIGludCB4LCBp
bnQgeSwgaW50IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkg
ewogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgZGlzcGxheUNoYW5nZWQoR0xBdXRvRHJh
d2FibGUgZHJhd2FibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVh
biBtb2RlQ2hhbmdlZCwgYm9vbGVhbiBkZXZpY2VDaGFuZ2VkKSB7CiAgICAgICAgfQogICAgfQoK
ICAgIC8qKgogICAgICogU2V0cyB3aGV0aGVyIHZlcnRleCBhcnJheXMgYXJlIGJlaW5nIHVzZWQg
aW50ZXJuYWxseSBmb3IKICAgICAqIHJlbmRlcmluZywgb3Igd2hldGhlciB0ZXh0IGlzIHJlbmRl
cmVkIHVzaW5nIHRoZSBPcGVuR0wKICAgICAqIGltbWVkaWF0ZSBtb2RlIGNvbW1hbmRzLiBUaGlz
IGlzIHByb3ZpZGVkIGFzIGEgY29uY2Vzc2lvbiBmb3IKICAgICAqIGNlcnRhaW4gZ3JhcGhpY3Mg
Y2FyZHMgd2hpY2ggaGF2ZSBwb29yIHZlcnRleCBhcnJheQogICAgICogcGVyZm9ybWFuY2UuIERl
ZmF1bHRzIHRvIHRydWUuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHNldFVzZVZlcnRleEFycmF5
cyhib29sZWFuIHVzZVZlcnRleEFycmF5cykgewogICAgICAgIHRoaXMudXNlVmVydGV4QXJyYXlz
ID0gdXNlVmVydGV4QXJyYXlzOwogICAgfQoKICAgIC8qKgogICAgICogSW5kaWNhdGVzIHdoZXRo
ZXIgdmVydGV4IGFycmF5cyBhcmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5IGZvcgogICAgICogcmVu
ZGVyaW5nLCBvciB3aGV0aGVyIHRleHQgaXMgcmVuZGVyZWQgdXNpbmcgdGhlIE9wZW5HTAogICAg
ICogaW1tZWRpYXRlIG1vZGUgY29tbWFuZHMuIERlZmF1bHRzIHRvIHRydWUuCiAgICAgKi8KICAg
IHB1YmxpYyBib29sZWFuIGdldFVzZVZlcnRleEFycmF5cygpIHsKICAgICAgICByZXR1cm4gdXNl
VmVydGV4QXJyYXlzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyB3aGV0aGVyIHNtb290aGlu
ZyAoaS5lLiwgR0xfTElORUFSIGZpbHRlcmluZykgaXMgZW5hYmxlZAogICAgICogaW4gdGhlIGJh
Y2tpbmcgVGV4dHVyZVJlbmRlcmVyIG9mIHRoaXMgVGV4dFJlbmRlcmVyLiBBIGZldwogICAgICog
Z3JhcGhpY3MgY2FyZHMgZG8gbm90IGJlaGF2ZSB3ZWxsIHdoZW4gdGhpcyBpcyBlbmFibGVkLAog
ICAgICogcmVzdWx0aW5nIGluIGZ1enp5IHRleHQuIERlZmF1bHRzIHRvIHRydWUuCiAgICAgKi8K
ICAgIHB1YmxpYyB2b2lkIHNldFNtb290aGluZyhib29sZWFuIHNtb290aGluZykgewogICAgICAg
IHRoaXMuc21vb3RoaW5nID0gc21vb3RoaW5nOwogICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLnNl
dFNtb290aGluZyhzbW9vdGhpbmcpOwogICAgfQoKICAgIC8qKgogICAgICogSW5kaWNhdGVzIHdo
ZXRoZXIgc21vb3RoaW5nIGlzIGVuYWJsZWQgaW4gdGhlIGJhY2tpbmcKICAgICAqIFRleHR1cmVS
ZW5kZXJlciBvZiB0aGlzIFRleHRSZW5kZXJlci4gQSBmZXcgZ3JhcGhpY3MgY2FyZHMgZG8KICAg
ICAqIG5vdCBiZWhhdmUgd2VsbCB3aGVuIHRoaXMgaXMgZW5hYmxlZCwgcmVzdWx0aW5nIGluIGZ1
enp5IHRleHQuCiAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgogICAgICovCiAgICBwdWJsaWMgYm9v
bGVhbiBnZXRTbW9vdGhpbmcoKSB7CiAgICAgICAgcmV0dXJuIHNtb290aGluZzsKICAgIH0KCiAg
ICBwcml2YXRlIGJvb2xlYW4gaXNWQk9BdmFpbGFibGUoR0wgZ2wpIHsKICAgICAgICBpZiAoIWNo
ZWNrRm9yX2lzRXh0ZW5zaW9uQXZhaWxhYmxlX1ZCTykgewogICAgICAgICAgICBpc0V4dGVuc2lv
bkF2YWlsYWJsZV9WQk8gPSBnbC5pc0V4dGVuc2lvbkF2YWlsYWJsZSgiR0xfVkVSU0lPTl8xXzUi
KTsKCSAgICAvKioKCSAgICAgKiBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QgaXMgYXZhaWxh
YmxlIGluIE9wZW5HTCAxLjQgYW5kIHNvbWV0aW1lcwogICAgICAgICAgICAgKiBpbiBPcGVuR0wg
MS4zLiBNaXhpbmcgdmVydGV4IGFycmF5cyBhbmQgVkJPIGNhbiBjYXVzZSBzb21lIHByb2JsZW1z
IAogICAgICAgICAgICAgKiB3aGVuIGNhbGxpbmcgZ2xWZXJ0ZXhQb2ludGVyIGZyb20gdGhlIFRl
eHRSZW5kZXJlciB3aGVyZWFzIAogICAgICAgICAgICAgKiBnbEJpbmRCdWZmZXJBUkIgd2FzIGNh
bGxlZCBiZWZvcmUgaW4gb3JkZXIgdG8gYmluZCBhIFZCTyBiZWNhdXNlIG5vIFZCTyAKCSAgICAg
KiBtdXN0IGJlIGFscmVhZHkgYm91bmQgd2hlbiBjYWxsaW5nIGdsVmVydGV4UG9pbnRlciB3aXRo
IGEgTklPIAoJICAgICAqIGJ1ZmZlciBhcyBsYXN0IGFyZ3VtZW50LgoJICAgICAqIFdlIGNhbm5v
dCBhc2sgdGhlIHByb2dyYW1tZXJzIHRvIGV4cGxpY2l0bHkgdW5iaW5kIHRoZWlyIFZCT3MKCSAg
ICAgKiB0byBhdm9pZCB0aGlzIHByb2JsZW0gYmVjYXVzZSBpdCBoYXMgYW4gaW1wb3J0YW50IGNv
c3QgCgkgICAgICogZXNwZWNpYWxseSBmb3Igc3RhdGljIFZCT3MuCgkgICAgICovCgkgICAgaXNB
UkJFeHRlbnNpb25BdmFpbGFibGVfVkJPID0gZmFsc2U7CgkgICAgaWYgKCFpc0V4dGVuc2lvbkF2
YWlsYWJsZV9WQk8pIHsKCSAgICAgICAgaWYgKGdsLmlzRXh0ZW5zaW9uQXZhaWxhYmxlKCJHTF9W
RVJTSU9OXzFfNCIpIHx8IGdsLmlzRXh0ZW5zaW9uQXZhaWxhYmxlKCJHTF9WRVJTSU9OXzFfMyIp
KSB7CgkJICAgIGlmIChnbC5pc0V4dGVuc2lvbkF2YWlsYWJsZSgiR0xfQVJCX3ZlcnRleF9idWZm
ZXJfb2JqZWN0IikgCgkJICAgICAgICAmJiBnbC5pc0Z1bmN0aW9uQXZhaWxhYmxlKCJnbEJpbmRC
dWZmZXJBUkIiKQoJCQkmJiBnbC5pc0Z1bmN0aW9uQXZhaWxhYmxlKCJnbEJ1ZmZlckRhdGFBUkIi
KQoJCQkmJiBnbC5pc0Z1bmN0aW9uQXZhaWxhYmxlKCJnbEdlbkJ1ZmZlcnNBUkIiKSkgewoJCQlp
c0V4dGVuc2lvbkF2YWlsYWJsZV9WQk8gPSB0cnVlOwoJCQlpc0FSQkV4dGVuc2lvbkF2YWlsYWJs
ZV9WQk8gPSB0cnVlOwoJICAgICAgICAgICAgfQoJCX0KCSAgICB9CiAgICAgICAgICAgIGNoZWNr
Rm9yX2lzRXh0ZW5zaW9uQXZhaWxhYmxlX1ZCTyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJl
dHVybiBpc0V4dGVuc2lvbkF2YWlsYWJsZV9WQk8gfHwgaXNBUkJFeHRlbnNpb25BdmFpbGFibGVf
VkJPOwogICAgfQp9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>131</attachid>
            <date>2008-06-03 12:39:00 +0200</date>
            <delta_ts>2008-06-03 12:39:00 +0200</delta_ts>
            <desc>Cleanest bug fix version 4 (tested, works but has poor performance)</desc>
            <filename>TextRenderer.java</filename>
            <type>text/plain</type>
            <size>79374</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChjKSAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKICogbWV0OgogKgog
KiAtIFJlZGlzdHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIC0gUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgogKgogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIElu
Yy4gb3IgdGhlIG5hbWVzIG9mCiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRoaXMgc29mdHdhcmUg
aXMgcHJvdmlkZWQgIkFTIElTLCIgd2l0aG91dCBhIHdhcnJhbnR5IG9mIGFueSBraW5kLiBBTEwK
ICogRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FS
UkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJ
TElUWSwgRklUTkVTUyBGT1IgQQogKiBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdF
TUVOVCwgQVJFIEhFUkVCWSBFWENMVURFRC4gU1VOCiAqIE1JQ1JPU1lTVEVNUywgSU5DLiAoIlNV
TiIpIEFORCBJVFMgTElDRU5TT1JTIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SCiAqIEFOWSBEQU1B
R0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIFVTSU5HLCBNT0RJRllJTkcg
T1IKICogRElTVFJJQlVUSU5HIFRISVMgU09GVFdBUkUgT1IgSVRTIERFUklWQVRJVkVTLiBJTiBO
TyBFVkVOVCBXSUxMIFNVTiBPUgogKiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIExP
U1QgUkVWRU5VRSwgUFJPRklUIE9SIERBVEEsIE9SIEZPUgogKiBESVJFQ1QsIElORElSRUNULCBT
UEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SIFBVTklUSVZFCiAqIERBTUFHRVMs
IEhPV0VWRVIgQ0FVU0VEIEFORCBSRUdBUkRMRVNTIE9GIFRIRSBUSEVPUlkgT0YgTElBQklMSVRZ
LAogKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRgogKiBTVU4gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0VTLgogKgogKiBZb3UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIHNvZnR3
YXJlIGlzIG5vdCBkZXNpZ25lZCBvciBpbnRlbmRlZCBmb3IgdXNlCiAqIGluIHRoZSBkZXNpZ24s
IGNvbnN0cnVjdGlvbiwgb3BlcmF0aW9uIG9yIG1haW50ZW5hbmNlIG9mIGFueSBudWNsZWFyCiAq
IGZhY2lsaXR5LgogKgogKiBTdW4gZ3JhdGVmdWxseSBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIHNv
ZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGF1dGhvcmVkCiAqIGFuZCBkZXZlbG9wZWQgYnkgS2VubmV0
aCBCcmFkbGV5IFJ1c3NlbGwgYW5kIENocmlzdG9waGVyIEpvaG4gS2xpbmUuCiAqLwpwYWNrYWdl
IGNvbS5zdW4ub3BlbmdsLnV0aWwuajJkOwoKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwuKjsK
aW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwucGFja3JlY3QuKjsKaW1wb3J0IGNvbS5zdW4ub3Bl
bmdsLnV0aWwuKjsKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLnV0aWwudGV4dHVyZS4qOwoKaW1wb3J0
IGphdmEuYXd0LkFscGhhQ29tcG9zaXRlOwppbXBvcnQgamF2YS5hd3QuQ29sb3I7CmltcG9ydCBq
YXZhLmF3dC5Db21wb3NpdGU7CgovLyBGb3IgZGVidWdnaW5nIHB1cnBvc2VzCmltcG9ydCBqYXZh
LmF3dC5FdmVudFF1ZXVlOwppbXBvcnQgamF2YS5hd3QuRm9udDsKaW1wb3J0IGphdmEuYXd0LkZy
YW1lOwppbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKaW1wb3J0IGphdmEuYXd0LkltYWdlOwpp
bXBvcnQgamF2YS5hd3QuUG9pbnQ7CmltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKaW1w
b3J0IGphdmEuYXd0LmV2ZW50Lio7CmltcG9ydCBqYXZhLmF3dC5mb250Lio7CmltcG9ydCBqYXZh
LmF3dC5nZW9tLio7CgppbXBvcnQgamF2YS5uaW8uKjsKCmltcG9ydCBqYXZhLnRleHQuKjsKCmlt
cG9ydCBqYXZhLnV0aWwuKjsKCmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuKjsKaW1wb3J0IGph
dmF4Lm1lZGlhLm9wZW5nbC5nbHUuKjsKCgovKiogUmVuZGVycyBiaXRtYXBwZWQgSmF2YSAyRCB0
ZXh0IGludG8gYW4gT3BlbkdMIHdpbmRvdyB3aXRoIGhpZ2gKICAgIHBlcmZvcm1hbmNlLCBmdWxs
IFVuaWNvZGUgc3VwcG9ydCwgYW5kIGEgc2ltcGxlIEFQSS4gUGVyZm9ybXMKICAgIGFwcHJvcHJp
YXRlIGNhY2hpbmcgb2YgdGV4dCByZW5kZXJpbmcgcmVzdWx0cyBpbiBhbiBPcGVuR0wgdGV4dHVy
ZQogICAgaW50ZXJuYWxseSB0byBhdm9pZCByZXBlYXRlZCBmb250IHJhc3Rlcml6YXRpb24uIFRo
ZSBjYWNoaW5nIGlzCiAgICBjb21wbGV0ZWx5IGF1dG9tYXRpYywgZG9lcyBub3QgcmVxdWlyZSBh
bnkgdXNlciBpbnRlcnZlbnRpb24sIGFuZAogICAgaGFzIG5vIHZpc2libGUgY29udHJvbHMgaW4g
dGhlIHB1YmxpYyBBUEkuIDxQPgoKICAgIFVzaW5nIHRoZSB7QGxpbmsgVGV4dFJlbmRlcmVyIFRl
eHRSZW5kZXJlcn0gaXMgc2ltcGxlLiBBZGQgYQogICAgIjxjb2RlPlRleHRSZW5kZXJlciByZW5k
ZXJlcjs8L2NvZGU+IiBmaWVsZCB0byB5b3VyIHtAbGluawogICAgamF2YXgubWVkaWEub3Blbmds
LkdMRXZlbnRMaXN0ZW5lciBHTEV2ZW50TGlzdGVuZXJ9LiBJbiB5b3VyIHtAbGluawogICAgamF2
YXgubWVkaWEub3BlbmdsLkdMRXZlbnRMaXN0ZW5lciNpbml0IGluaXR9IG1ldGhvZCwgYWRkOgoK
ICAgIDxQUkU+CiAgICByZW5kZXJlciA9IG5ldyBUZXh0UmVuZGVyZXIobmV3IEZvbnQoIlNhbnNT
ZXJpZiIsIEZvbnQuQk9MRCwgMzYpKTsKICAgIDwvUFJFPgoKICAgIDxQPiBJbiB0aGUge0BsaW5r
IGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIjZGlzcGxheSBkaXNwbGF5fSBtZXRo
b2Qgb2YgeW91cgogICAge0BsaW5rIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIg
R0xFdmVudExpc3RlbmVyfSwgYWRkOgogICAgPFBSRT4KICAgIHJlbmRlcmVyLmJlZ2luUmVuZGVy
aW5nKGRyYXdhYmxlLmdldFdpZHRoKCksIGRyYXdhYmxlLmdldEhlaWdodCgpKTsKICAgIC8vIG9w
dGlvbmFsbHkgc2V0IHRoZSBjb2xvcgogICAgcmVuZGVyZXIuc2V0Q29sb3IoMS4wZiwgMC4yZiwg
MC4yZiwgMC44Zik7CiAgICByZW5kZXJlci5kcmF3KCJUZXh0IHRvIGRyYXciLCB4UG9zaXRpb24s
IHlQb3NpdGlvbik7CiAgICAvLyAuLi4gbW9yZSBkcmF3IGNvbW1hbmRzLCBjb2xvciBjaGFuZ2Vz
LCBldGMuCiAgICByZW5kZXJlci5lbmRSZW5kZXJpbmcoKTsKICAgIDwvUFJFPgoKICAgIFVubGVz
cyB5b3UgYXJlIHNoYXJpbmcgdGV4dHVyZXMgYW5kIGRpc3BsYXkgbGlzdHMgYmV0d2VlbiBPcGVu
R0wKICAgIGNvbnRleHRzLCB5b3UgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGUge0BsaW5rICNkaXNw
b3NlIGRpc3Bvc2V9CiAgICBtZXRob2Qgb2YgdGhlIFRleHRSZW5kZXJlcjsgdGhlIE9wZW5HTCBy
ZXNvdXJjZXMgaXQgdXNlcwogICAgaW50ZXJuYWxseSB3aWxsIGJlIGNsZWFuZWQgdXAgYXV0b21h
dGljYWxseSB3aGVuIHRoZSBPcGVuR0wKICAgIGNvbnRleHQgaXMgZGVzdHJveWVkLiA8UD4KCiAg
ICA8Yj5Ob3RlPC9iPiB0aGF0IHRoZSBUZXh0UmVuZGVyZXIgbWF5IGNhdXNlIHRoZSB2ZXJ0ZXgg
YW5kIHRleHR1cmUKICAgIGNvb3JkaW5hdGUgYXJyYXkgYnVmZmVyIGJpbmRpbmdzIHRvIGNoYW5n
ZSwgb3IgdG8gYmUgdW5ib3VuZC4gVGhpcwogICAgaXMgaW1wb3J0YW50IHRvIG5vdGUgaWYgeW91
IGFyZSB1c2luZyBWZXJ0ZXggQnVmZmVyIE9iamVjdHMgKFZCT3MpCiAgICBpbiB5b3VyIGFwcGxp
Y2F0aW9uLiA8UD4KCiAgICBJbnRlcm5hbGx5LCB0aGUgcmVuZGVyZXIgdXNlcyBhIHJlY3Rhbmds
ZSBwYWNraW5nIGFsZ29yaXRobSB0bwogICAgcGFjayBib3RoIGdseXBocyBhbmQgZnVsbCBTdHJp
bmdzJyByZW5kZXJpbmcgcmVzdWx0cyAod2hpY2ggYXJlCiAgICB2YXJpYWJsZSBzaXplKSBvbnRv
IGEgbGFyZ2VyIE9wZW5HTCB0ZXh0dXJlLiBUaGUgaW50ZXJuYWwgYmFja2luZwogICAgc3RvcmUg
aXMgbWFpbnRhaW5lZCB1c2luZyBhIHtAbGluawogICAgY29tLnN1bi5vcGVuZ2wudXRpbC5qMmQu
VGV4dHVyZVJlbmRlcmVyIFRleHR1cmVSZW5kZXJlcn0uIEEgbGVhc3QKICAgIHJlY2VudGx5IHVz
ZWQgKExSVSkgYWxnb3JpdGhtIGlzIHVzZWQgdG8gZGlzY2FyZCBwcmV2aW91c2x5CiAgICByZW5k
ZXJlZCBzdHJpbmdzOyB0aGUgc3BlY2lmaWMgYWxnb3JpdGhtIGlzIHVuZGVmaW5lZCwgYnV0IGlz
CiAgICBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYnkgZmx1c2hpbmcgdW51c2VkIFN0cmluZ3MnIHJl
bmRlcmluZwogICAgcmVzdWx0cyBldmVyeSBmZXcgaHVuZHJlZCByZW5kZXJpbmcgY3ljbGVzLCB3
aGVyZSBhIHJlbmRlcmluZwogICAgY3ljbGUgaXMgZGVmaW5lZCBhcyBhIHBhaXIgb2YgY2FsbHMg
dG8ge0BsaW5rICNiZWdpblJlbmRlcmluZwogICAgYmVnaW5SZW5kZXJpbmd9IC8ge0BsaW5rICNl
bmRSZW5kZXJpbmcgZW5kUmVuZGVyaW5nfS4KCiAgICBAYXV0aG9yIEpvaG4gQnVya2V5CiAgICBA
YXV0aG9yIEtlbm5ldGggUnVzc2VsbAoqLwpwdWJsaWMgY2xhc3MgVGV4dFJlbmRlcmVyIHsKICAg
IHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEZWJ1Zy5kZWJ1ZygiVGV4dFJl
bmRlcmVyIik7CgogICAgLy8gVGhlc2UgYXJlIG9jY2FzaW9uYWxseSB1c2VmdWwgZm9yIG1vcmUg
aW4tZGVwdGggZGVidWdnaW5nCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU0FC
TEVfR0xZUEhfQ0FDSEUgPSBmYWxzZTsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4g
RFJBV19CQk9YRVMgPSBmYWxzZTsKCiAgICBzdGF0aWMgZmluYWwgaW50IGtTaXplID0gMjU2OwoK
ICAgIC8vIEV2ZXJ5IGNlcnRhaW4gbnVtYmVyIG9mIHJlbmRlciBjeWNsZXMsIGZsdXNoIHRoZSBz
dHJpbmdzIHdoaWNoCiAgICAvLyBoYXZlbid0IGJlZW4gdXNlZCByZWNlbnRseQogICAgcHJpdmF0
ZSBzdGF0aWMgZmluYWwgaW50IENZQ0xFU19QRVJfRkxVU0ggPSAxMDA7CgogICAgLy8gVGhlIGFt
b3VudCBvZiB2ZXJ0aWNhbCBkZWFkIHNwYWNlIG9uIHRoZSBiYWNraW5nIHN0b3JlIGJlZm9yZSB3
ZQogICAgLy8gZm9yY2UgYSBjb21wYWN0aW9uCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9h
dCBNQVhfVkVSVElDQUxfRlJBR01FTlRBVElPTiA9IDAuN2Y7CiAgICBzdGF0aWMgZmluYWwgaW50
IGtRdWFkc1BlckJ1ZmZlciA9IDEwMDsKICAgIHN0YXRpYyBmaW5hbCBpbnQga0Nvb3Jkc1BlclZl
cnRWZXJ0cyA9IDM7CiAgICBzdGF0aWMgZmluYWwgaW50IGtDb29yZHNQZXJWZXJ0VGV4ID0gMjsK
ICAgIHN0YXRpYyBmaW5hbCBpbnQga1ZlcnRzUGVyUXVhZCA9IDQ7CiAgICBzdGF0aWMgZmluYWwg
aW50IGtUb3RhbEJ1ZmZlclNpemVWZXJ0cyA9IGtRdWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1
YWQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNWZXJ0cyA9IGtR
dWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1YWQgKiBrQ29vcmRzUGVyVmVydFZlcnRzOwogICAg
c3RhdGljIGZpbmFsIGludCBrVG90YWxCdWZmZXJTaXplQ29vcmRzVGV4ID0ga1F1YWRzUGVyQnVm
ZmVyICoga1ZlcnRzUGVyUXVhZCAqIGtDb29yZHNQZXJWZXJ0VGV4OwogICAgc3RhdGljIGZpbmFs
IGludCBrVG90YWxCdWZmZXJTaXplQnl0ZXNWZXJ0cyA9IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNW
ZXJ0cyAqIDQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVCeXRlc1RleCA9
IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNUZXggKiA0OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6
ZUluQnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSA9IGtDb29yZHNQZXJWZXJ0VmVydHMgKiA0
OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6ZUluQnl0ZXNfT25lVmVydGljZXNfVGV4RGF0YSA9
IGtDb29yZHNQZXJWZXJ0VGV4ICogNDsKICAgIHByaXZhdGUgRm9udCBmb250OwogICAgcHJpdmF0
ZSBib29sZWFuIGFudGlhbGlhc2VkOwogICAgcHJpdmF0ZSBib29sZWFuIHVzZUZyYWN0aW9uYWxN
ZXRyaWNzOwoKICAgIC8vIFdoZXRoZXIgd2UncmUgYXR0ZW1wdGluZyB0byB1c2UgYXV0b21hdGlj
IG1pcG1hcCBnZW5lcmF0aW9uIHN1cHBvcnQKICAgIHByaXZhdGUgYm9vbGVhbiBtaXBtYXA7CiAg
ICBwcml2YXRlIFJlY3RhbmdsZVBhY2tlciBwYWNrZXI7CiAgICBwcml2YXRlIGJvb2xlYW4gaGF2
ZU1heFNpemU7CiAgICBwcml2YXRlIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlOwogICAg
cHJpdmF0ZSBUZXh0dXJlUmVuZGVyZXIgY2FjaGVkQmFja2luZ1N0b3JlOwogICAgcHJpdmF0ZSBH
cmFwaGljczJEIGNhY2hlZEdyYXBoaWNzOwogICAgcHJpdmF0ZSBGb250UmVuZGVyQ29udGV4dCBj
YWNoZWRGb250UmVuZGVyQ29udGV4dDsKICAgIHByaXZhdGUgTWFwIC8qPFN0cmluZyxSZWN0Piov
IHN0cmluZ0xvY2F0aW9ucyA9IG5ldyBIYXNoTWFwIC8qPFN0cmluZyxSZWN0PiovKCk7CiAgICBw
cml2YXRlIEdseXBoUHJvZHVjZXIgbUdseXBoUHJvZHVjZXI7CgogICAgcHJpdmF0ZSBpbnQgbnVt
UmVuZGVyQ3ljbGVzOwoKICAgIC8vIE5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3Jl
IGluIGEgYmVnaW5SZW5kZXJpbmcoKSAvCiAgICAvLyBlbmRSZW5kZXJpbmcoKSBjeWNsZSBzbyB3
ZSBjYW4gcmUtZW50ZXIgdGhlIGV4YWN0IHNhbWUgc3RhdGUgaWYKICAgIC8vIHdlIGhhdmUgdG8g
cmVhbGxvY2F0ZSB0aGUgYmFja2luZyBzdG9yZQogICAgcHJpdmF0ZSBib29sZWFuIGluQmVnaW5F
bmRQYWlyOwogICAgcHJpdmF0ZSBib29sZWFuIGlzT3J0aG9Nb2RlOwogICAgcHJpdmF0ZSBpbnQg
YmVnaW5SZW5kZXJpbmdXaWR0aDsKICAgIHByaXZhdGUgaW50IGJlZ2luUmVuZGVyaW5nSGVpZ2h0
OwogICAgcHJpdmF0ZSBib29sZWFuIGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQ7Cgog
ICAgLy8gRm9yIHJlc2V0dGluZyB0aGUgY29sb3IgYWZ0ZXIgZGlzcG9zYWwgb2YgdGhlIG9sZCBi
YWNraW5nIHN0b3JlCiAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUNhY2hlZENvbG9yOwogICAgcHJp
dmF0ZSBmbG9hdCBjYWNoZWRSOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRHOwogICAgcHJpdmF0
ZSBmbG9hdCBjYWNoZWRCOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRBOwogICAgcHJpdmF0ZSBD
b2xvciBjYWNoZWRDb2xvcjsKICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9SZXNldENvbG9yOwoK
ICAgIC8vIEZvciBkZWJ1Z2dpbmcgb25seQogICAgcHJpdmF0ZSBGcmFtZSBkYmdGcmFtZTsKCiAg
ICAvLyBEZWJ1Z2dpbmcgcHVycG9zZXMgb25seQogICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnZ2Vk
OwogICAgUGlwZWxpbmVkX1F1YWRSZW5kZXJlciBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyOwogICAg
CiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcKICAgIHByaXZhdGUgYm9vbGVhbiB1c2VW
ZXJ0ZXhBcnJheXMgPSB0cnVlOwogICAgCiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcK
ICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dGVuc2lvbkF2YWlsYWJsZV9WQk87CiAgICBwcml2YXRl
IGJvb2xlYW4gY2hlY2tGb3JfaXNFeHRlbnNpb25BdmFpbGFibGVfVkJPOwoKICAgIC8vIFdoZXRo
ZXIgR0xfTElORUFSIGZpbHRlcmluZyBpcyBlbmFibGVkIGZvciB0aGUgYmFja2luZyBzdG9yZQog
ICAgcHJpdmF0ZSBib29sZWFuIHNtb290aGluZyA9IHRydWU7CgogICAgLyoqIENyZWF0ZXMgYSBu
ZXcgVGV4dFJlbmRlcmVyIHdpdGggdGhlIGdpdmVuIGZvbnQsIHVzaW5nIG5vCiAgICAgICAgYW50
aWFsaWFzaW5nIG9yIGZyYWN0aW9uYWwgbWV0cmljcywgYW5kIHRoZSBkZWZhdWx0CiAgICAgICAg
UmVuZGVyRGVsZWdhdGUuIEVxdWl2YWxlbnQgdG8gPGNvZGU+VGV4dFJlbmRlcmVyKGZvbnQsIGZh
bHNlLAogICAgICAgIGZhbHNlKTwvY29kZT4uCgogICAgICAgIEBwYXJhbSBmb250IHRoZSBmb250
IHRvIHJlbmRlciB3aXRoCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQp
IHsKICAgICAgICB0aGlzKGZvbnQsIGZhbHNlLCBmYWxzZSwgbnVsbCwgZmFsc2UpOwogICAgfQoK
ICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRSZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBmb250LCB1
c2luZyBubwogICAgICAgIGFudGlhbGlhc2luZyBvciBmcmFjdGlvbmFsIG1ldHJpY3MsIGFuZCB0
aGUgZGVmYXVsdAogICAgICAgIFJlbmRlckRlbGVnYXRlLiBJZiA8Q09ERT5taXBtYXA8L0NPREU+
IGlzIHRydWUsIGF0dGVtcHRzIHRvIHVzZQogICAgICAgIE9wZW5HTCdzIGF1dG9tYXRpYyBtaXBt
YXAgZ2VuZXJhdGlvbiBmb3IgYmV0dGVyIHNtb290aGluZyB3aGVuCiAgICAgICAgcmVuZGVyaW5n
IHRoZSBUZXh0dXJlUmVuZGVyZXIncyBjb250ZW50cyBhdCBhIGRpc3RhbmNlLgogICAgICAgIEVx
dWl2YWxlbnQgdG8gPGNvZGU+VGV4dFJlbmRlcmVyKGZvbnQsIGZhbHNlLCBmYWxzZSk8L2NvZGU+
LgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0aAogICAgICAgIEBw
YXJhbSBtaXBtYXAgd2hldGhlciB0byBhdHRlbXB0IHVzZSBvZiBhdXRvbWF0aWMgbWlwbWFwIGdl
bmVyYXRpb24KICAgICovCiAgICBwdWJsaWMgVGV4dFJlbmRlcmVyKEZvbnQgZm9udCwgYm9vbGVh
biBtaXBtYXApIHsKICAgICAgICB0aGlzKGZvbnQsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbWlwbWFw
KTsKICAgIH0KCiAgICAvKiogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgd2l0aCB0aGUgZ2l2
ZW4gRm9udCwgc3BlY2lmaWVkIGZvbnQKICAgICAgICBwcm9wZXJ0aWVzLCBhbmQgZGVmYXVsdCBS
ZW5kZXJEZWxlZ2F0ZS4gVGhlCiAgICAgICAgPGNvZGU+YW50aWFsaWFzZWQ8L2NvZGU+IGFuZCA8
Y29kZT51c2VGcmFjdGlvbmFsTWV0cmljczwvY29kZT4KICAgICAgICBmbGFncyBwcm92aWRlIGNv
bnRyb2wgb3ZlciB0aGUgc2FtZSBwcm9wZXJ0aWVzIGF0IHRoZSBKYXZhIDJECiAgICAgICAgbGV2
ZWwuIE5vIG1pcG1hcCBzdXBwb3J0IGlzIHJlcXVlc3RlZC4gRXF1aXZhbGVudCB0bwogICAgICAg
IDxjb2RlPlRleHRSZW5kZXJlcihmb250LCBhbnRpYWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJp
Y3MsCiAgICAgICAgbnVsbCk8L2NvZGU+LgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0
byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJhbSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBh
bnRpYWxpYXNlZCBmb250cwogICAgICAgIEBwYXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0
aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQKICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJE
IGxldmVsCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQsIGJvb2xlYW4g
YW50aWFsaWFzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRnJhY3Rpb25h
bE1ldHJpY3MpIHsKICAgICAgICB0aGlzKGZvbnQsIGFudGlhbGlhc2VkLCB1c2VGcmFjdGlvbmFs
TWV0cmljcywgbnVsbCwgZmFsc2UpOwogICAgfQoKICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRS
ZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBGb250LCBzcGVjaWZpZWQgZm9udAogICAgICAgIHByb3Bl
cnRpZXMsIGFuZCBnaXZlbiBSZW5kZXJEZWxlZ2F0ZS4gVGhlCiAgICAgICAgPGNvZGU+YW50aWFs
aWFzZWQ8L2NvZGU+IGFuZCA8Y29kZT51c2VGcmFjdGlvbmFsTWV0cmljczwvY29kZT4KICAgICAg
ICBmbGFncyBwcm92aWRlIGNvbnRyb2wgb3ZlciB0aGUgc2FtZSBwcm9wZXJ0aWVzIGF0IHRoZSBK
YXZhIDJECiAgICAgICAgbGV2ZWwuIFRoZSA8Y29kZT5yZW5kZXJEZWxlZ2F0ZTwvY29kZT4gcHJv
dmlkZXMgbW9yZSBjb250cm9sCiAgICAgICAgb3ZlciB0aGUgdGV4dCByZW5kZXJlZC4gTm8gbWlw
bWFwIHN1cHBvcnQgaXMgcmVxdWVzdGVkLgoKICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0
byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJhbSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBh
bnRpYWxpYXNlZCBmb250cwogICAgICAgIEBwYXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0
aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQKICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJE
IGxldmVsCiAgICAgICAgQHBhcmFtIHJlbmRlckRlbGVnYXRlIHRoZSByZW5kZXIgZGVsZWdhdGUg
dG8gdXNlIHRvIGRyYXcgdGhlCiAgICAgICAgdGV4dCdzIGJpdG1hcCwgb3IgbnVsbCB0byB1c2Ug
dGhlIGRlZmF1bHQgb25lCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZvbnQs
IGJvb2xlYW4gYW50aWFsaWFzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNl
RnJhY3Rpb25hbE1ldHJpY3MsIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlKSB7CiAgICAg
ICAgdGhpcyhmb250LCBhbnRpYWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJpY3MsIHJlbmRlckRl
bGVnYXRlLCBmYWxzZSk7CiAgICB9CgogICAgLyoqIENyZWF0ZXMgYSBuZXcgVGV4dFJlbmRlcmVy
IHdpdGggdGhlIGdpdmVuIEZvbnQsIHNwZWNpZmllZCBmb250CiAgICAgICAgcHJvcGVydGllcywg
YW5kIGdpdmVuIFJlbmRlckRlbGVnYXRlLiBUaGUKICAgICAgICA8Y29kZT5hbnRpYWxpYXNlZDwv
Y29kZT4gYW5kIDxjb2RlPnVzZUZyYWN0aW9uYWxNZXRyaWNzPC9jb2RlPgogICAgICAgIGZsYWdz
IHByb3ZpZGUgY29udHJvbCBvdmVyIHRoZSBzYW1lIHByb3BlcnRpZXMgYXQgdGhlIEphdmEgMkQK
ICAgICAgICBsZXZlbC4gVGhlIDxjb2RlPnJlbmRlckRlbGVnYXRlPC9jb2RlPiBwcm92aWRlcyBt
b3JlIGNvbnRyb2wKICAgICAgICBvdmVyIHRoZSB0ZXh0IHJlbmRlcmVkLiBJZiA8Q09ERT5taXBt
YXA8L0NPREU+IGlzIHRydWUsIGF0dGVtcHRzCiAgICAgICAgdG8gdXNlIE9wZW5HTCdzIGF1dG9t
YXRpYyBtaXBtYXAgZ2VuZXJhdGlvbiBmb3IgYmV0dGVyIHNtb290aGluZwogICAgICAgIHdoZW4g
cmVuZGVyaW5nIHRoZSBUZXh0dXJlUmVuZGVyZXIncyBjb250ZW50cyBhdCBhIGRpc3RhbmNlLgoK
ICAgICAgICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0aAogICAgICAgIEBwYXJh
bSBhbnRpYWxpYXNlZCB3aGV0aGVyIHRvIHVzZSBhbnRpYWxpYXNlZCBmb250cwogICAgICAgIEBw
YXJhbSB1c2VGcmFjdGlvbmFsTWV0cmljcyB3aGV0aGVyIHRvIHVzZSBmcmFjdGlvbmFsIGZvbnQK
ICAgICAgICBtZXRyaWNzIGF0IHRoZSBKYXZhIDJEIGxldmVsCiAgICAgICAgQHBhcmFtIHJlbmRl
ckRlbGVnYXRlIHRoZSByZW5kZXIgZGVsZWdhdGUgdG8gdXNlIHRvIGRyYXcgdGhlCiAgICAgICAg
dGV4dCdzIGJpdG1hcCwgb3IgbnVsbCB0byB1c2UgdGhlIGRlZmF1bHQgb25lCiAgICAgICAgQHBh
cmFtIG1pcG1hcCB3aGV0aGVyIHRvIGF0dGVtcHQgdXNlIG9mIGF1dG9tYXRpYyBtaXBtYXAgZ2Vu
ZXJhdGlvbgogICAgKi8KICAgIHB1YmxpYyBUZXh0UmVuZGVyZXIoRm9udCBmb250LCBib29sZWFu
IGFudGlhbGlhc2VkLAogICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUZyYWN0aW9u
YWxNZXRyaWNzLCBSZW5kZXJEZWxlZ2F0ZSByZW5kZXJEZWxlZ2F0ZSwKICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vbGVhbiBtaXBtYXApIHsKICAgICAgICB0aGlzLmZvbnQgPSBmb250OwogICAg
ICAgIHRoaXMuYW50aWFsaWFzZWQgPSBhbnRpYWxpYXNlZDsKICAgICAgICB0aGlzLnVzZUZyYWN0
aW9uYWxNZXRyaWNzID0gdXNlRnJhY3Rpb25hbE1ldHJpY3M7CiAgICAgICAgdGhpcy5taXBtYXAg
PSBtaXBtYXA7CgogICAgICAgIC8vIEZJWE1FOiBjb25zaWRlciBhZGp1c3RpbmcgdGhlIHNpemUg
YmFzZWQgb24gZm9udCBzaXplCiAgICAgICAgLy8gKGl0IHdpbGwgYWxyZWFkeSBhdXRvbWF0aWNh
bGx5IHJlc2l6ZSBpZiBuZWNlc3NhcnkpCiAgICAgICAgcGFja2VyID0gbmV3IFJlY3RhbmdsZVBh
Y2tlcihuZXcgTWFuYWdlcigpLCBrU2l6ZSwga1NpemUpOwoKICAgICAgICBpZiAocmVuZGVyRGVs
ZWdhdGUgPT0gbnVsbCkgewogICAgICAgICAgICByZW5kZXJEZWxlZ2F0ZSA9IG5ldyBEZWZhdWx0
UmVuZGVyRGVsZWdhdGUoKTsKICAgICAgICB9CgogICAgICAgIHRoaXMucmVuZGVyRGVsZWdhdGUg
PSByZW5kZXJEZWxlZ2F0ZTsKCiAgICAgICAgbUdseXBoUHJvZHVjZXIgPSBuZXcgR2x5cGhQcm9k
dWNlcihmb250LmdldE51bUdseXBocygpKTsKICAgIH0KCiAgICAvKiogUmV0dXJucyB0aGUgYm91
bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBnaXZlbiBTdHJpbmcsIGFzc3VtaW5nIGl0CiAgICAgICAg
d2FzIHJlbmRlcmVkIGF0IHRoZSBvcmlnaW4uIFNlZSB7QGxpbmsgI2dldEJvdW5kcyhDaGFyU2Vx
dWVuY2UpCiAgICAgICAgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSl9LiAqLwogICAgcHVibGljIFJl
Y3RhbmdsZTJEIGdldEJvdW5kcyhTdHJpbmcgc3RyKSB7CiAgICAgICAgcmV0dXJuIGdldEJvdW5k
cygoQ2hhclNlcXVlbmNlKSBzdHIpOwogICAgfQoKICAgIC8qKiBSZXR1cm5zIHRoZSBib3VuZGlu
ZyByZWN0YW5nbGUgb2YgdGhlIGdpdmVuIENoYXJTZXF1ZW5jZSwKICAgICAgICBhc3N1bWluZyBp
dCB3YXMgcmVuZGVyZWQgYXQgdGhlIG9yaWdpbi4gVGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mCiAg
ICAgICAgdGhlIHJldHVybmVkIHJlY3RhbmdsZSBpcyBKYXZhIDJEJ3MsIHdpdGggaW5jcmVhc2lu
ZyBZCiAgICAgICAgY29vcmRpbmF0ZXMgaW4gdGhlIGRvd253YXJkIGRpcmVjdGlvbi4gVGhlIHJl
bGF0aXZlIGNvb3JkaW5hdGUKICAgICAgICAoMCwgMCkgaW4gdGhlIHJldHVybmVkIHJlY3Rhbmds
ZSBjb3JyZXNwb25kcyB0byB0aGUgYmFzZWxpbmUgb2YKICAgICAgICB0aGUgbGVmdG1vc3QgY2hh
cmFjdGVyIG9mIHRoZSByZW5kZXJlZCBzdHJpbmcsIGluIHNpbWlsYXIKICAgICAgICBmYXNoaW9u
IHRvIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5LCBmb3IgZXhhbXBsZSwge0BsaW5rCiAgICAgICAg
amF2YS5hd3QuZm9udC5HbHlwaFZlY3RvciNnZXRWaXN1YWxCb3VuZHN9LiBNb3N0IGFwcGxpY2F0
aW9ucwogICAgICAgIHdpbGwgdXNlIG9ubHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHJl
dHVybmVkIFJlY3RhbmdsZSBmb3IKICAgICAgICB0aGUgcHVycG9zZXMgb2YgY2VudGVyaW5nIG9y
IGp1c3RpZnlpbmcgdGhlIFN0cmluZy4gSXQgaXMgbm90CiAgICAgICAgc3BlY2lmaWVkIHdoaWNo
IEphdmEgMkQgYm91bmRzICh7QGxpbmsKICAgICAgICBqYXZhLmF3dC5mb250LkdseXBoVmVjdG9y
I2dldFZpc3VhbEJvdW5kcyBnZXRWaXN1YWxCb3VuZHN9LAogICAgICAgIHtAbGluayBqYXZhLmF3
dC5mb250LkdseXBoVmVjdG9yI2dldFBpeGVsQm91bmRzIGdldFBpeGVsQm91bmRzfSwKICAgICAg
ICBldGMuKSB0aGUgcmV0dXJuZWQgYm91bmRzIGNvcnJlc3BvbmQgdG8sIGFsdGhvdWdoIGV2ZXJ5
IGVmZm9ydAogICAgICAgIGlzIG1hZGUgdG8gZW5zdXJlIGFuIGFjY3VyYXRlIGJvdW5kLiAqLwog
ICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kcyhDaGFyU2VxdWVuY2Ugc3RyKSB7CiAgICAg
ICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIG1vcmUgb3B0aW1pemVkIGFuZCB1c2UgdGhlIGds
eXBoIGNhY2hlCiAgICAgICAgUmVjdCByID0gbnVsbDsKCiAgICAgICAgaWYgKChyID0gKFJlY3Qp
IHN0cmluZ0xvY2F0aW9ucy5nZXQoc3RyKSkgIT0gbnVsbCkgewogICAgICAgICAgICBUZXh0RGF0
YSBkYXRhID0gKFRleHREYXRhKSByLmdldFVzZXJEYXRhKCk7CgogICAgICAgICAgICAvLyBSZWNv
bnN0aXR1dGUgdGhlIEphdmEgMkQgcmVzdWx0cyBiYXNlZCBvbiB0aGUgY2FjaGVkIHZhbHVlcwog
ICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZTJELkRvdWJsZSgtZGF0YS5vcmlnaW4oKS54
LCAtZGF0YS5vcmlnaW4oKS55LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByLncoKSwgci5oKCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gTXVzdCByZXR1cm4gYSBS
ZWN0YW5nbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBsYXlvdXQgYWxnb3JpdGhtIC0tCiAgICAgICAg
Ly8gbXVzdCBiZSBpZGVtcG90ZW50CiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShyZW5kZXJEZWxl
Z2F0ZS5nZXRCb3VuZHMoc3RyLCBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGdldEZvbnRSZW5kZXJDb250ZXh0KCkpKTsKICAgIH0KCiAgICAv
KiogUmV0dXJucyB0aGUgRm9udCB0aGlzIHJlbmRlcmVyIGlzIHVzaW5nLiAqLwogICAgcHVibGlj
IEZvbnQgZ2V0Rm9udCgpIHsKICAgICAgICByZXR1cm4gZm9udDsKICAgIH0KCiAgICAvKiogUmV0
dXJucyBhIEZvbnRSZW5kZXJDb250ZXh0IHdoaWNoIGNhbiBiZSB1c2VkIGZvciBleHRlcm5hbAog
ICAgICAgIHRleHQtcmVsYXRlZCBzaXplIGNvbXB1dGF0aW9ucy4gVGhpcyBvYmplY3Qgc2hvdWxk
IGJlIGNvbnNpZGVyZWQKICAgICAgICB0cmFuc2llbnQgYW5kIG1heSBiZWNvbWUgaW52YWxpZGF0
ZWQgYmV0d2VlbiB7QGxpbmsKICAgICAgICAjYmVnaW5SZW5kZXJpbmcgYmVnaW5SZW5kZXJpbmd9
IC8ge0BsaW5rICNlbmRSZW5kZXJpbmcKICAgICAgICBlbmRSZW5kZXJpbmd9IHBhaXJzLiAqLwog
ICAgcHVibGljIEZvbnRSZW5kZXJDb250ZXh0IGdldEZvbnRSZW5kZXJDb250ZXh0KCkgewogICAg
ICAgIGlmIChjYWNoZWRGb250UmVuZGVyQ29udGV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgIGNh
Y2hlZEZvbnRSZW5kZXJDb250ZXh0ID0gZ2V0R3JhcGhpY3MyRCgpLmdldEZvbnRSZW5kZXJDb250
ZXh0KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2FjaGVkRm9udFJlbmRlckNvbnRleHQ7
CiAgICB9CgogICAgLyoqIEJlZ2lucyByZW5kZXJpbmcgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVu
ZGVyZXIgVGV4dFJlbmRlcmVyfQogICAgICAgIGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdh
YmxlLCBwdXNoaW5nIHRoZSBwcm9qZWN0aW9uIGFuZAogICAgICAgIG1vZGVsdmlldyBtYXRyaWNl
cyBhbmQgc29tZSBzdGF0ZSBiaXRzIGFuZCBzZXR0aW5nIHVwIGEKICAgICAgICB0d28tZGltZW5z
aW9uYWwgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gd2l0aCAoMCwgMCkgYXMgdGhlCiAgICAgICAg
bG93ZXItbGVmdCBjb29yZGluYXRlIGFuZCAod2lkdGgsIGhlaWdodCkgYXMgdGhlIHVwcGVyLXJp
Z2h0CiAgICAgICAgY29vcmRpbmF0ZS4gQmluZHMgYW5kIGVuYWJsZXMgdGhlIGludGVybmFsIE9w
ZW5HTCB0ZXh0dXJlCiAgICAgICAgb2JqZWN0LCBzZXRzIHRoZSB0ZXh0dXJlIGVudmlyb25tZW50
IG1vZGUgdG8gR0xfTU9EVUxBVEUsIGFuZAogICAgICAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgY29s
b3IgdG8gdGhlIGxhc3QgY29sb3Igc2V0IHdpdGggdGhpcwogICAgICAgIFRleHRSZW5kZXJlciB2
aWEge0BsaW5rICNzZXRDb2xvciBzZXRDb2xvcn0uIFRoaXMgbWV0aG9kCiAgICAgICAgZGlzYWJs
ZXMgdGhlIGRlcHRoIHRlc3QgYW5kIGlzIGVxdWl2YWxlbnQgdG8KICAgICAgICBiZWdpblJlbmRl
cmluZyh3aWR0aCwgaGVpZ2h0LCB0cnVlKS4KCiAgICAgICAgQHBhcmFtIHdpZHRoIHRoZSB3aWR0
aCBvZiB0aGUgY3VycmVudCBvbi1zY3JlZW4gT3BlbkdMIGRyYXdhYmxlCiAgICAgICAgQHBhcmFt
IGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBjdXJyZW50IG9uLXNjcmVlbiBPcGVuR0wgZHJhd2Fi
bGUKICAgICAgICBAdGhyb3dzIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV4Y2VwdGlvbiBJZiBhbiBP
cGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAog
ICAgKi8KICAgIHB1YmxpYyB2b2lkIGJlZ2luUmVuZGVyaW5nKGludCB3aWR0aCwgaW50IGhlaWdo
dCkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBiZWdpblJlbmRlcmluZyh3aWR0aCwgaGVp
Z2h0LCB0cnVlKTsKICAgIH0KCiAgICAvKiogQmVnaW5zIHJlbmRlcmluZyB3aXRoIHRoaXMge0Bs
aW5rIFRleHRSZW5kZXJlciBUZXh0UmVuZGVyZXJ9CiAgICAgICAgaW50byB0aGUgY3VycmVudCBP
cGVuR0wgZHJhd2FibGUsIHB1c2hpbmcgdGhlIHByb2plY3Rpb24gYW5kCiAgICAgICAgbW9kZWx2
aWV3IG1hdHJpY2VzIGFuZCBzb21lIHN0YXRlIGJpdHMgYW5kIHNldHRpbmcgdXAgYQogICAgICAg
IHR3by1kaW1lbnNpb25hbCBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiB3aXRoICgwLCAwKSBhcyB0
aGUKICAgICAgICBsb3dlci1sZWZ0IGNvb3JkaW5hdGUgYW5kICh3aWR0aCwgaGVpZ2h0KSBhcyB0
aGUgdXBwZXItcmlnaHQKICAgICAgICBjb29yZGluYXRlLiBCaW5kcyBhbmQgZW5hYmxlcyB0aGUg
aW50ZXJuYWwgT3BlbkdMIHRleHR1cmUKICAgICAgICBvYmplY3QsIHNldHMgdGhlIHRleHR1cmUg
ZW52aXJvbm1lbnQgbW9kZSB0byBHTF9NT0RVTEFURSwgYW5kCiAgICAgICAgY2hhbmdlcyB0aGUg
Y3VycmVudCBjb2xvciB0byB0aGUgbGFzdCBjb2xvciBzZXQgd2l0aCB0aGlzCiAgICAgICAgVGV4
dFJlbmRlcmVyIHZpYSB7QGxpbmsgI3NldENvbG9yIHNldENvbG9yfS4gRGlzYWJsZXMgdGhlIGRl
cHRoCiAgICAgICAgdGVzdCBpZiB0aGUgZGlzYWJsZURlcHRoVGVzdCBhcmd1bWVudCBpcyB0cnVl
LgoKICAgICAgICBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBjdXJyZW50IG9uLXNjcmVl
biBPcGVuR0wgZHJhd2FibGUKICAgICAgICBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhl
IGN1cnJlbnQgb24tc2NyZWVuIE9wZW5HTCBkcmF3YWJsZQogICAgICAgIEBwYXJhbSBkaXNhYmxl
RGVwdGhUZXN0IHdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgZGVwdGggdGVzdAogICAgICAgIEB0aHJv
d3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBiZWdpblJlbmRlcmlu
ZyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gZGlzYWJsZURlcHRoVGVzdCkKICAgICAg
ICB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGJlZ2luUmVuZGVyaW5nKHRydWUsIHdpZHRo
LCBoZWlnaHQsIGRpc2FibGVEZXB0aFRlc3QpOwogICAgfQoKICAgIC8qKiBCZWdpbnMgcmVuZGVy
aW5nIG9mIDJEIHRleHQgaW4gM0Qgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIKICAgICAg
ICBUZXh0UmVuZGVyZXJ9IGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdhYmxlLiBBc3N1bWVz
IHRoZSBlbmQKICAgICAgICB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHVwIHRoZSBt
b2RlbHZpZXcgYW5kIHByb2plY3Rpb24KICAgICAgICBtYXRyaWNlcywgYW5kIHdpbGwgcmVuZGVy
IHRleHQgdXNpbmcgdGhlIHtAbGluayAjZHJhdzNEIGRyYXczRH0KICAgICAgICBtZXRob2QuIFRo
aXMgbWV0aG9kIHB1c2hlcyBzb21lIE9wZW5HTCBzdGF0ZSBiaXRzLCBiaW5kcyBhbmQKICAgICAg
ICBlbmFibGVzIHRoZSBpbnRlcm5hbCBPcGVuR0wgdGV4dHVyZSBvYmplY3QsIHNldHMgdGhlIHRl
eHR1cmUKICAgICAgICBlbnZpcm9ubWVudCBtb2RlIHRvIEdMX01PRFVMQVRFLCBhbmQgY2hhbmdl
cyB0aGUgY3VycmVudCBjb2xvcgogICAgICAgIHRvIHRoZSBsYXN0IGNvbG9yIHNldCB3aXRoIHRo
aXMgVGV4dFJlbmRlcmVyIHZpYSB7QGxpbmsKICAgICAgICAjc2V0Q29sb3Igc2V0Q29sb3J9LgoK
ICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBj
dXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQg
YmVnaW4zRFJlbmRlcmluZygpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgYmVnaW5SZW5k
ZXJpbmcoZmFsc2UsIDAsIDAsIGZhbHNlKTsKICAgIH0KCiAgICAvKiogQ2hhbmdlcyB0aGUgY3Vy
cmVudCBjb2xvciBvZiB0aGlzIFRleHRSZW5kZXJlciB0byB0aGUgc3VwcGxpZWQKICAgICAgICBv
bmUuIFRoZSBkZWZhdWx0IGNvbG9yIGlzIG9wYXF1ZSB3aGl0ZS4KCiAgICAgICAgQHBhcmFtIGNv
bG9yIHRoZSBuZXcgY29sb3IgdG8gdXNlIGZvciByZW5kZXJpbmcgdGV4dAogICAgICAgIEB0aHJv
d3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihDb2xv
ciBjb2xvcikgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBib29sZWFuIG5vTmVlZEZvckZs
dXNoID0gKGhhdmVDYWNoZWRDb2xvciAmJiAoY2FjaGVkQ29sb3IgIT0gbnVsbCkgJiYKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLmVxdWFscyhjYWNoZWRDb2xvcikpOwoK
ICAgICAgICBpZiAoIW5vTmVlZEZvckZsdXNoKSB7CiAgICAgICAgICAgIGZsdXNoR2x5cGhQaXBl
bGluZSgpOwogICAgICAgIH0KCiAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuc2V0Q29sb3IoY29s
b3IpOwogICAgICAgIGhhdmVDYWNoZWRDb2xvciA9IHRydWU7CiAgICAgICAgY2FjaGVkQ29sb3Ig
PSBjb2xvcjsKICAgIH0KCiAgICAvKiogQ2hhbmdlcyB0aGUgY3VycmVudCBjb2xvciBvZiB0aGlz
IFRleHRSZW5kZXJlciB0byB0aGUgc3VwcGxpZWQKICAgICAgICBvbmUsIHdoZXJlIGVhY2ggY29t
cG9uZW50IHJhbmdlcyBmcm9tIDAuMGYgLSAxLjBmLiBUaGUgYWxwaGEKICAgICAgICBjb21wb25l
bnQsIGlmIHVzZWQsIGRvZXMgbm90IG5lZWQgdG8gYmUgcHJlbXVsdGlwbGllZCBpbnRvIHRoZQog
ICAgICAgIGNvbG9yIGNoYW5uZWxzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBm
b3Ige0BsaW5rCiAgICAgICAgY29tLnN1bi5vcGVuZ2wudXRpbC50ZXh0dXJlLlRleHR1cmUgVGV4
dHVyZX0sIGFsdGhvdWdoCiAgICAgICAgcHJlbXVsdGlwbGllZCBjb2xvcnMgYXJlIHVzZWQgaW50
ZXJuYWxseS4gVGhlIGRlZmF1bHQgY29sb3IgaXMKICAgICAgICBvcGFxdWUgd2hpdGUuCgogICAg
ICAgIEBwYXJhbSByIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3IKICAgICAgICBA
cGFyYW0gZyB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3IKICAgICAgICBAcGFy
YW0gYiB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIG5ldyBjb2xvcgogICAgICAgIEBwYXJhbSBh
IHRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIG5ldyBjb2xvciwgMC4wZiA9IGNvbXBsZXRlbHkK
ICAgICAgICB0cmFuc3BhcmVudCwgMS4wZiA9IGNvbXBsZXRlbHkgb3BhcXVlCiAgICAgICAgQHRo
cm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVu
IHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZs
b2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCiAgICAgICAgdGhyb3dzIEdMRXhjZXB0
aW9uIHsKICAgICAgICBib29sZWFuIG5vTmVlZEZvckZsdXNoID0gKGhhdmVDYWNoZWRDb2xvciAm
JiAoY2FjaGVkQ29sb3IgPT0gbnVsbCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChyID09IGNhY2hlZFIpICYmIChnID09IGNhY2hlZEcpICYmIChiID09IGNhY2hlZEIpICYm
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSA9PSBjYWNoZWRBKSk7CgogICAg
ICAgIGlmICghbm9OZWVkRm9yRmx1c2gpIHsKICAgICAgICAgICAgZmx1c2hHbHlwaFBpcGVsaW5l
KCk7CiAgICAgICAgfQoKICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xvcihyLCBnLCBi
LCBhKTsKICAgICAgICBoYXZlQ2FjaGVkQ29sb3IgPSB0cnVlOwogICAgICAgIGNhY2hlZFIgPSBy
OwogICAgICAgIGNhY2hlZEcgPSBnOwogICAgICAgIGNhY2hlZEIgPSBiOwogICAgICAgIGNhY2hl
ZEEgPSBhOwogICAgICAgIGNhY2hlZENvbG9yID0gbnVsbDsKICAgIH0KCiAgICAvKiogRHJhd3Mg
dGhlIHN1cHBsaWVkIENoYXJTZXF1ZW5jZSBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiB1c2luZwog
ICAgICAgIHRoZSByZW5kZXJlcidzIGN1cnJlbnQgY29sb3IuIFRoZSBiYXNlbGluZSBvZiB0aGUg
bGVmdG1vc3QKICAgICAgICBjaGFyYWN0ZXIgaXMgYXQgcG9zaXRpb24gKHgsIHkpIHNwZWNpZmll
ZCBpbiBPcGVuR0wgY29vcmRpbmF0ZXMsCiAgICAgICAgd2hlcmUgdGhlIG9yaWdpbiBpcyBhdCB0
aGUgbG93ZXItbGVmdCBvZiB0aGUgZHJhd2FibGUgYW5kIHRoZSBZCiAgICAgICAgY29vcmRpbmF0
ZSBpbmNyZWFzZXMgaW4gdGhlIHVwd2FyZCBkaXJlY3Rpb24uCgogICAgICAgIEBwYXJhbSBzdHIg
dGhlIHN0cmluZyB0byBkcmF3CiAgICAgICAgQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBhdCB3
aGljaCB0byBkcmF3CiAgICAgICAgQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBhdCB3aGljaCB0
byBkcmF3CiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBp
cyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1Ymxp
YyB2b2lkIGRyYXcoQ2hhclNlcXVlbmNlIHN0ciwgaW50IHgsIGludCB5KSB0aHJvd3MgR0xFeGNl
cHRpb24gewogICAgICAgIGRyYXczRChzdHIsIHgsIHksIDAsIDEpOwogICAgfQoKICAgIC8qKiBE
cmF3cyB0aGUgc3VwcGxpZWQgU3RyaW5nIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIHVzaW5nIHRo
ZQogICAgICAgIHJlbmRlcmVyJ3MgY3VycmVudCBjb2xvci4gU2VlIHtAbGluayAjZHJhdyhDaGFy
U2VxdWVuY2UsIGludCwKICAgICAgICBpbnQpIGRyYXcoQ2hhclNlcXVlbmNlLCBpbnQsIGludCl9
LiAqLwogICAgcHVibGljIHZvaWQgZHJhdyhTdHJpbmcgc3RyLCBpbnQgeCwgaW50IHkpIHRocm93
cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgZHJhdzNEKHN0ciwgeCwgeSwgMCwgMSk7CiAgICB9Cgog
ICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBDaGFyU2VxdWVuY2UgYXQgdGhlIGRlc2lyZWQgM0Qg
bG9jYXRpb24gdXNpbmcKICAgICAgICB0aGUgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9yLiBUaGUg
YmFzZWxpbmUgb2YgdGhlIGxlZnRtb3N0CiAgICAgICAgY2hhcmFjdGVyIGlzIHBsYWNlZCBhdCBw
b3NpdGlvbiAoeCwgeSwgeikgaW4gdGhlIGN1cnJlbnQKICAgICAgICBjb29yZGluYXRlIHN5c3Rl
bS4KCiAgICAgICAgQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGRyYXcKICAgICAgICBAcGFyYW0g
eCB0aGUgeCBjb29yZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0geSB0aGUg
eSBjb29yZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0geiB0aGUgeiBjb29y
ZGluYXRlIGF0IHdoaWNoIHRvIGRyYXcKICAgICAgICBAcGFyYW0gc2NhbGVGYWN0b3IgYSB1bmlm
b3JtIHNjYWxlIGZhY3RvciBhcHBsaWVkIHRvIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBk
cmF3biByZWN0YW5nbGUKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBj
b250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwog
ICAgcHVibGljIHZvaWQgZHJhdzNEKENoYXJTZXF1ZW5jZSBzdHIsIGZsb2F0IHgsIGZsb2F0IHks
IGZsb2F0IHosCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAg
ICAgICBpbnRlcm5hbF9kcmF3M0Qoc3RyLCB4LCB5LCB6LCBzY2FsZUZhY3Rvcik7CiAgICB9Cgog
ICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBTdHJpbmcgYXQgdGhlIGRlc2lyZWQgM0QgbG9jYXRp
b24gdXNpbmcgdGhlCiAgICAgICAgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9yLiBTZWUge0BsaW5r
ICNkcmF3M0QoQ2hhclNlcXVlbmNlLAogICAgICAgIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0
KSBkcmF3M0QoQ2hhclNlcXVlbmNlLCBmbG9hdCwgZmxvYXQsCiAgICAgICAgZmxvYXQsIGZsb2F0
KX0uICovCiAgICBwdWJsaWMgdm9pZCBkcmF3M0QoU3RyaW5nIHN0ciwgZmxvYXQgeCwgZmxvYXQg
eSwgZmxvYXQgeiwgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAgICAgICBpbnRlcm5hbF9kcmF3M0Qo
c3RyLCB4LCB5LCB6LCBzY2FsZUZhY3Rvcik7CiAgICB9CgogICAgLyoqIFJldHVybnMgdGhlIHBp
eGVsIHdpZHRoIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIuICovCiAgICBwdWJsaWMgZmxvYXQgZ2V0
Q2hhcldpZHRoKGNoYXIgaW5DaGFyKSB7CiAgICAgICAgcmV0dXJuIG1HbHlwaFByb2R1Y2VyLmdl
dEdseXBoUGl4ZWxXaWR0aChpbkNoYXIpOwogICAgfQoKICAgIC8qKiBDYXVzZXMgdGhlIFRleHRS
ZW5kZXJlciB0byBmbHVzaCBhbnkgaW50ZXJuYWwgY2FjaGVzIGl0IG1heSBiZQogICAgICAgIG1h
aW50YWluaW5nIGFuZCBkcmF3IGl0cyByZW5kZXJpbmcgcmVzdWx0cyB0byB0aGUgc2NyZWVuLiBU
aGlzCiAgICAgICAgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBlYWNoIGNhbGwgdG8gZHJhdygpIGlm
IHlvdSBhcmUgc2V0dGluZwogICAgICAgIE9wZW5HTCBzdGF0ZSBzdWNoIGFzIHRoZSBtb2RlbHZp
ZXcgbWF0cml4IGJldHdlZW4gY2FsbHMgdG8KICAgICAgICBkcmF3KCkuICovCiAgICBwdWJsaWMg
dm9pZCBmbHVzaCgpIHsKICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUoKTsKICAgIH0KCiAgICAv
KiogRW5kcyBhIHJlbmRlciBjeWNsZSB3aXRoIHRoaXMge0BsaW5rIFRleHRSZW5kZXJlciBUZXh0
UmVuZGVyZXJ9LgogICAgICAgIFJlc3RvcmVzIHRoZSBwcm9qZWN0aW9uIGFuZCBtb2RlbHZpZXcg
bWF0cmljZXMgYXMgd2VsbCBhcwogICAgICAgIHNldmVyYWwgT3BlbkdMIHN0YXRlIGJpdHMuIFNo
b3VsZCBiZSBwYWlyZWQgd2l0aCB7QGxpbmsKICAgICAgICAjYmVnaW5SZW5kZXJpbmcgYmVnaW5S
ZW5kZXJpbmd9LgoKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250
ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAg
cHVibGljIHZvaWQgZW5kUmVuZGVyaW5nKCkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBl
bmRSZW5kZXJpbmcodHJ1ZSk7CiAgICB9CgogICAgLyoqIEVuZHMgYSAzRCByZW5kZXIgY3ljbGUg
d2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIgVGV4dFJlbmRlcmVyfS4KICAgICAgICBSZXN0
b3JlcyBzZXZlcmFsIE9wZW5HTCBzdGF0ZSBiaXRzLiBTaG91bGQgYmUgcGFpcmVkIHdpdGgge0Bs
aW5rCiAgICAgICAgI2JlZ2luM0RSZW5kZXJpbmcgYmVnaW4zRFJlbmRlcmluZ30uCgogICAgICAg
IEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQg
d2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBlbmQzRFJl
bmRlcmluZygpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgZW5kUmVuZGVyaW5nKGZhbHNl
KTsKICAgIH0KCiAgICAvKiogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyB0aGlzIFRleHRSZW5k
ZXJlciBpcyB1c2luZy4gSXQgaXMgbm90CiAgICAgICAgdmFsaWQgdG8gdXNlIHRoZSBUZXh0UmVu
ZGVyZXIgYWZ0ZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgoKICAgICAgICBAdGhyb3dzIEdMRXhj
ZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRo
b2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHRocm93cyBHTEV4
Y2VwdGlvbiB7CiAgICAgICAgcGFja2VyLmRpc3Bvc2UoKTsKICAgICAgICBwYWNrZXIgPSBudWxs
OwogICAgICAgIGNhY2hlZEJhY2tpbmdTdG9yZSA9IG51bGw7CiAgICAgICAgY2FjaGVkR3JhcGhp
Y3MgPSBudWxsOwogICAgICAgIGNhY2hlZEZvbnRSZW5kZXJDb250ZXh0ID0gbnVsbDsKCiAgICAg
ICAgaWYgKGRiZ0ZyYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgZGJnRnJhbWUuZGlzcG9zZSgp
OwogICAgICAgIH0KICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEludGVybmFscyBv
bmx5IGJlbG93IHRoaXMgcG9pbnQKICAgIC8vCgogICAgcHJpdmF0ZSBzdGF0aWMgUmVjdGFuZ2xl
MkQgcHJlTm9ybWFsaXplKFJlY3RhbmdsZTJEIHNyYykgewogICAgICAgIC8vIE5lZWQgdG8gcm91
bmQgdG8gaW50ZWdlciBjb29yZGluYXRlcwogICAgICAgIC8vIEFsc28gZ2l2ZSBvdXJzZWx2ZXMg
YSBsaXR0bGUgc2xvcCBhcm91bmQgdGhlIHJlcG9ydGVkCiAgICAgICAgLy8gYm91bmRzIG9mIGds
eXBocyBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgbmVpdGhlciB0aGUgdmlzdWFsCiAgICAgICAgLy8g
bm9yIHRoZSBwaXhlbCBib3VuZHMgd29ya3MgcGVyZmVjdGx5IHdlbGwKICAgICAgICBpbnQgbWlu
WCA9IChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblgoKSkgLSAxOwogICAgICAgIGludCBtaW5Z
ID0gKGludCkgTWF0aC5mbG9vcihzcmMuZ2V0TWluWSgpKSAtIDE7CiAgICAgICAgaW50IG1heFgg
PSAoaW50KSBNYXRoLmNlaWwoc3JjLmdldE1heFgoKSkgKyAxOwogICAgICAgIGludCBtYXhZID0g
KGludCkgTWF0aC5jZWlsKHNyYy5nZXRNYXhZKCkpICsgMTsKICAgICAgICByZXR1cm4gbmV3IFJl
Y3RhbmdsZTJELkRvdWJsZShtaW5YLCBtaW5ZLCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpOwog
ICAgfQoKCiAgICBwcml2YXRlIFJlY3RhbmdsZTJEIG5vcm1hbGl6ZShSZWN0YW5nbGUyRCBzcmMp
IHsKICAgICAgICAvLyBHaXZlIG91cnNlbHZlcyBhIGJvdW5kYXJ5IGFyb3VuZCBlYWNoIGVudGl0
eSBvbiB0aGUgYmFja2luZwogICAgICAgIC8vIHN0b3JlIGluIG9yZGVyIHRvIHByZXZlbnQgYmxl
ZWRpbmcgb2YgbmVhcmJ5IFN0cmluZ3MgZHVlIHRvCiAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3
ZSB1c2UgbGluZWFyIGZpbHRlcmluZwoKICAgICAgICAvLyBOT1RFIHRoYXQgdGhpcyBib3VuZGFy
eSBpcyBxdWl0ZSBoZXVyaXN0aWMgYW5kIGlzIHJlbGF0ZWQKICAgICAgICAvLyB0byBob3cgZmFy
IGF3YXkgaW4gM0Qgd2UgbWF5IHZpZXcgdGhlIHRleHQgLS0KICAgICAgICAvLyBoZXVyaXN0aWNh
bGx5LCAxLjUlIG9mIHRoZSBmb250J3MgaGVpZ2h0CiAgICAgICAgaW50IGJvdW5kYXJ5ID0gKGlu
dCkgTWF0aC5tYXgoMSwgMC4wMTUgKiBmb250LmdldFNpemUoKSk7CgogICAgICAgIHJldHVybiBu
ZXcgUmVjdGFuZ2xlMkQuRG91YmxlKChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblgoKSAtIGJv
dW5kYXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRo
LmZsb29yKHNyYy5nZXRNaW5ZKCkgLSBib3VuZGFyeSksCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKHNyYy5nZXRXaWR0aCgpICsgMiAqIGJvdW5k
YXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmNl
aWwoc3JjLmdldEhlaWdodCgpKSArIDIgKiBib3VuZGFyeSk7CiAgICB9CgogICAgcHJpdmF0ZSBU
ZXh0dXJlUmVuZGVyZXIgZ2V0QmFja2luZ1N0b3JlKCkgewogICAgICAgIFRleHR1cmVSZW5kZXJl
ciByZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIpIHBhY2tlci5nZXRCYWNraW5nU3RvcmUoKTsK
CiAgICAgICAgaWYgKHJlbmRlcmVyICE9IGNhY2hlZEJhY2tpbmdTdG9yZSkgewogICAgICAgICAg
ICAvLyBCYWNraW5nIHN0b3JlIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lOyBkaXNjYXJkIGFueSBj
YWNoZWQgR3JhcGhpY3MyRAogICAgICAgICAgICBpZiAoY2FjaGVkR3JhcGhpY3MgIT0gbnVsbCkg
ewogICAgICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3MuZGlzcG9zZSgpOwogICAgICAgICAgICAg
ICAgY2FjaGVkR3JhcGhpY3MgPSBudWxsOwogICAgICAgICAgICAgICAgY2FjaGVkRm9udFJlbmRl
ckNvbnRleHQgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYWNoZWRCYWNraW5n
U3RvcmUgPSByZW5kZXJlcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjYWNoZWRCYWNraW5n
U3RvcmU7CiAgICB9CgogICAgcHJpdmF0ZSBHcmFwaGljczJEIGdldEdyYXBoaWNzMkQoKSB7CiAg
ICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CgogICAg
ICAgIGlmIChjYWNoZWRHcmFwaGljcyA9PSBudWxsKSB7CiAgICAgICAgICAgIGNhY2hlZEdyYXBo
aWNzID0gcmVuZGVyZXIuY3JlYXRlR3JhcGhpY3MoKTsKCiAgICAgICAgICAgIC8vIFNldCB1cCBj
b21wb3NpdGUsIGZvbnQgYW5kIHJlbmRlcmluZyBoaW50cwogICAgICAgICAgICBjYWNoZWRHcmFw
aGljcy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuU3JjKTsKICAgICAgICAgICAgY2FjaGVk
R3JhcGhpY3Muc2V0Q29sb3IoQ29sb3IuV0hJVEUpOwogICAgICAgICAgICBjYWNoZWRHcmFwaGlj
cy5zZXRGb250KGZvbnQpOwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdI
aW50KFJlbmRlcmluZ0hpbnRzLktFWV9URVhUX0FOVElBTElBU0lORywKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW50aWFsaWFzZWQgPyBSZW5kZXJpbmdIaW50
cy5WQUxVRV9URVhUX0FOVElBTElBU19PTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICA6IFJlbmRlcmluZ0hpbnRzLlZBTFVFX1RFWFRfQU5USUFMSUFTX09GRikp
OwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hp
bnRzLktFWV9GUkFDVElPTkFMTUVUUklDUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodXNlRnJhY3Rpb25hbE1ldHJpY3MKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgPyBSZW5kZXJpbmdIaW50cy5WQUxVRV9GUkFDVElPTkFM
TUVUUklDU19PTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6
IFJlbmRlcmluZ0hpbnRzLlZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09GRikpOwogICAgICAgIH0K
CiAgICAgICAgcmV0dXJuIGNhY2hlZEdyYXBoaWNzOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBi
ZWdpblJlbmRlcmluZyhib29sZWFuIG9ydGhvLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlRGVwdGhUZXN0Rm9yT3J0
aG8pIHsKICAgICAgICBpZiAoREVCVUcgJiYgIWRlYnVnZ2VkKSB7CiAgICAgICAgICAgIGRlYnVn
KCk7CiAgICAgICAgfQoKICAgICAgICBpbkJlZ2luRW5kUGFpciA9IHRydWU7CiAgICAgICAgaXNP
cnRob01vZGUgPSBvcnRobzsKICAgICAgICBiZWdpblJlbmRlcmluZ1dpZHRoID0gd2lkdGg7CiAg
ICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgYmVnaW5SZW5kZXJp
bmdEZXB0aFRlc3REaXNhYmxlZCA9IGRpc2FibGVEZXB0aFRlc3RGb3JPcnRobzsKCiAgICAgICAg
aWYgKG9ydGhvKSB7CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmJlZ2luT3J0aG9SZW5k
ZXJpbmcod2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0Rm9yT3J0aG8pOwogICAgICAgIH0gZWxzZSB7
CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmJlZ2luM0RSZW5kZXJpbmcoKTsKICAgICAg
ICB9CgogICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwoKICAgICAgICAvLyBQdXNo
IGNsaWVudCBhdHRyaWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgog
ICAgICAgIGdsLmdsUHVzaENsaWVudEF0dHJpYigoaW50KSBHTC5HTF9BTExfQ0xJRU5UX0FUVFJJ
Ql9CSVRTKTsKCiAgICAgICAgaWYgKCFoYXZlTWF4U2l6ZSkgewogICAgICAgICAgICAvLyBRdWVy
eSBPcGVuR0wgZm9yIHRoZSBtYXhpbXVtIHRleHR1cmUgc2l6ZSBhbmQgc2V0IGl0IGluIHRoZQog
ICAgICAgICAgICAvLyBSZWN0YW5nbGVQYWNrZXIgdG8ga2VlcCBpdCBmcm9tIGV4cGFuZGluZyB0
b28gbGFyZ2UKICAgICAgICAgICAgaW50W10gc3ogPSBuZXcgaW50WzFdOwogICAgICAgICAgICBn
bC5nbEdldEludGVnZXJ2KEdMLkdMX01BWF9URVhUVVJFX1NJWkUsIHN6LCAwKTsKICAgICAgICAg
ICAgcGFja2VyLnNldE1heFNpemUoc3pbMF0sIHN6WzBdKTsKICAgICAgICAgICAgaGF2ZU1heFNp
emUgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5lZWRUb1Jlc2V0Q29sb3IgJiYgaGF2
ZUNhY2hlZENvbG9yKSB7CiAgICAgICAgICAgIGlmIChjYWNoZWRDb2xvciA9PSBudWxsKSB7CiAg
ICAgICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xvcihjYWNoZWRSLCBjYWNoZWRH
LCBjYWNoZWRCLCBjYWNoZWRBKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAg
IGdldEJhY2tpbmdTdG9yZSgpLnNldENvbG9yKGNhY2hlZENvbG9yKTsKICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgbmVlZFRvUmVzZXRDb2xvciA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAg
Ly8gRGlzYWJsZSBmdXR1cmUgYXR0ZW1wdHMgdG8gdXNlIG1pcG1hcHBpbmcgaWYgVGV4dHVyZVJl
bmRlcmVyCiAgICAgICAgLy8gZG9lc24ndCBzdXBwb3J0IGl0CiAgICAgICAgaWYgKG1pcG1hcCAm
JiAhZ2V0QmFja2luZ1N0b3JlKCkuaXNVc2luZ0F1dG9NaXBtYXBHZW5lcmF0aW9uKCkpIHsKICAg
ICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4o
IkRpc2FibGVkIG1pcG1hcHBpbmcgaW4gVGV4dFJlbmRlcmVyIik7CiAgICAgICAgICAgIH0KCiAg
ICAgICAgICAgIG1pcG1hcCA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAq
IGVtemljOiBoZXJlIHRoZSBjYWxsIHRvIGdsQmluZEJ1ZmZlciBjcmFzaGVzIG9uIGNlcnRhaW4g
Z3JhcGhpY3NjYXJkL2RyaXZlciBjb21iaW5hdGlvbnMKICAgICAqIHRoaXMgaXMgd2h5IHRoZSB1
Z2x5IHRyeS1jYXRjaCBibG9jayBoYXMgYmVlbiBhZGRlZCwgd2hpY2ggZmFsbHMgYmFjayB0byB0
aGUgb2xkIHRleHRyZW5kZXJlcgogICAgICogCiAgICAgKiBAcGFyYW0gb3J0aG8KICAgICAqIEB0
aHJvd3MgR0xFeGNlcHRpb24KICAgICAqLwogICAgcHJpdmF0ZSB2b2lkIGVuZFJlbmRlcmluZyhi
b29sZWFuIG9ydGhvKSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGZsdXNoR2x5cGhQaXBl
bGluZSgpOwoKICAgICAgICBpbkJlZ2luRW5kUGFpciA9IGZhbHNlOwoKICAgICAgICBHTCBnbCA9
IEdMVS5nZXRDdXJyZW50R0woKTsKCiAgICAgICAgLy8gUG9wIGNsaWVudCBhdHRyaWIgYml0cyB1
c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgogICAgICAgIGdsLmdsUG9wQ2xpZW50
QXR0cmliKCk7CgogICAgICAgIC8vIFRoZSBPcGVuR0wgc3BlYyBpcyB1bmNsZWFyIGFib3V0IHdo
ZXRoZXIgdGhpcyBjaGFuZ2VzIHRoZQogICAgICAgIC8vIGJ1ZmZlciBiaW5kaW5ncywgc28gcHJl
ZW1wdGl2ZWx5IHplcm8gb3V0IHRoZSBHTF9BUlJBWV9CVUZGRVIKICAgICAgICAvLyBiaW5kaW5n
CiAgICAgICAgaWYgKGlzVkJPQXZhaWxhYmxlKGdsKSkgewogICAgICAgICAgICB0cnkgewogICAg
ICAgICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7CiAgICAg
ICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBpc0V4dGVuc2lv
bkF2YWlsYWJsZV9WQk8gPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAg
aWYgKG9ydGhvKSB7CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmVuZE9ydGhvUmVuZGVy
aW5nKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuZW5k
M0RSZW5kZXJpbmcoKTsKICAgICAgICB9CgogICAgICAgIGlmICgrK251bVJlbmRlckN5Y2xlcyA+
PSBDWUNMRVNfUEVSX0ZMVVNIKSB7CiAgICAgICAgICAgIG51bVJlbmRlckN5Y2xlcyA9IDA7Cgog
ICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRs
bigiQ2xlYXJpbmcgdW51c2VkIGVudHJpZXMgaW4gZW5kUmVuZGVyaW5nKCkiKTsKICAgICAgICAg
ICAgfQoKICAgICAgICAgICAgY2xlYXJVbnVzZWRFbnRyaWVzKCk7CiAgICAgICAgfQogICAgfQoK
ICAgIHByaXZhdGUgdm9pZCBjbGVhclVudXNlZEVudHJpZXMoKSB7CiAgICAgICAgZmluYWwgamF2
YS51dGlsLkxpc3QgZGVhZFJlY3RzID0gbmV3IEFycmF5TGlzdCAvKjxSZWN0PiovKCk7CgogICAg
ICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY29udGVudHMgb2YgdGhlIGJhY2tpbmcgc3RvcmUs
IHJlbW92aW5nCiAgICAgICAgLy8gdGV4dCBzdHJpbmdzIHRoYXQgaGF2ZW4ndCBiZWVuIHVzZWQg
cmVjZW50bHkKICAgICAgICBwYWNrZXIudmlzaXQobmV3IFJlY3RWaXNpdG9yKCkgewogICAgICAg
ICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoUmVjdCByZWN0KSB7CiAgICAgICAgICAgICAgICAg
ICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwoKICAgICAg
ICAgICAgICAgICAgICBpZiAoZGF0YS51c2VkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAg
ZGF0YS5jbGVhclVzZWQoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAg
ICAgICAgICAgICAgICBkZWFkUmVjdHMuYWRkKHJlY3QpOwogICAgICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIGZvciAoSXRlcmF0b3Ig
aXRlciA9IGRlYWRSZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKICAgICAgICAg
ICAgUmVjdCByID0gKFJlY3QpIGl0ZXIubmV4dCgpOwogICAgICAgICAgICBwYWNrZXIucmVtb3Zl
KHIpOwogICAgICAgICAgICBzdHJpbmdMb2NhdGlvbnMucmVtb3ZlKCgoVGV4dERhdGEpIHIuZ2V0
VXNlckRhdGEoKSkuc3RyaW5nKCkpOwoKICAgICAgICAgICAgaW50IHVuaWNvZGVUb0NsZWFyRnJv
bUNhY2hlID0gKChUZXh0RGF0YSkgci5nZXRVc2VyRGF0YSgpKS51bmljb2RlSUQ7CgogICAgICAg
ICAgICBpZiAodW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUgPiAwKSB7CiAgICAgICAgICAgICAgICBt
R2x5cGhQcm9kdWNlci5jbGVhckNhY2hlRW50cnkodW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUpOwog
ICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAgICAgIGlmIChERUJVRykgewogICAgICAgICAg
ICAvLyAgICAgICAgR3JhcGhpY3MyRCBnID0gZ2V0R3JhcGhpY3MyRCgpOwogICAgICAgICAgICAv
LyAgICAgICAgZy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOwogICAgICAgICAg
ICAvLyAgICAgICAgZy5maWxsUmVjdChyLngoKSwgci55KCksIHIudygpLCByLmgoKSk7CiAgICAg
ICAgICAgIC8vICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0ZS5TcmMpOwogICAg
ICAgICAgICAvLyAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIElmIHdlIHJlbW92ZWQgZGVh
ZCByZWN0YW5nbGVzIHRoaXMgY3ljbGUsIHRyeSB0byBkbyBhIGNvbXBhY3Rpb24KICAgICAgICBm
bG9hdCBmcmFnID0gcGFja2VyLnZlcnRpY2FsRnJhZ21lbnRhdGlvblJhdGlvKCk7CgogICAgICAg
IGlmICghZGVhZFJlY3RzLmlzRW1wdHkoKSAmJiAoZnJhZyA+IE1BWF9WRVJUSUNBTF9GUkFHTUVO
VEFUSU9OKSkgewogICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3Rl
bS5lcnIucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFj
dGluZyBUZXh0UmVuZGVyZXIgYmFja2luZyBzdG9yZSBkdWUgdG8gdmVydGljYWwgZnJhZ21lbnRh
dGlvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnKTsKICAgICAg
ICAgICAgfQoKICAgICAgICAgICAgcGFja2VyLmNvbXBhY3QoKTsKICAgICAgICB9CgogICAgICAg
IGlmIChERUJVRykgewogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5tYXJrRGlydHkoMCwg
MCwgZ2V0QmFja2luZ1N0b3JlKCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmdldEhlaWdodCgpKTsKICAgICAgICB9
CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGludGVybmFsX2RyYXczRChDaGFyU2VxdWVuY2Ugc3Ry
LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmbG9hdCBzY2FsZUZhY3RvcikgewogICAgICAgIExpc3QvKjxHbHlwaD4qLyBnbHlwaHMg
PSBtR2x5cGhQcm9kdWNlci5nZXRHbHlwaHMoc3RyKTsKICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0
ZXIgPSBnbHlwaHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewogICAgICAgICAgICBH
bHlwaCBnbHlwaCA9IChHbHlwaCkgaXRlci5uZXh0KCk7CiAgICAgICAgICAgIGZsb2F0IGFkdmFu
Y2UgPSBnbHlwaC5kcmF3M0QoeCwgeSwgeiwgc2NhbGVGYWN0b3IpOwogICAgICAgICAgICB4ICs9
IGFkdmFuY2UgKiBzY2FsZUZhY3RvcjsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lk
IGZsdXNoR2x5cGhQaXBlbGluZSgpIHsKICAgICAgICBpZiAobVBpcGVsaW5lZFF1YWRSZW5kZXJl
ciAhPSBudWxsKSB7CiAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZHJhdygpOwog
ICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgZHJhdzNEX1JPQlVTVChDaGFyU2VxdWVu
Y2Ugc3RyLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IpIHsKICAgICAgICBTdHJpbmcgY3VyU3RyOwogICAg
ICAgIGlmIChzdHIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKICAgICAgICAgICAgY3VyU3RyID0gKFN0
cmluZykgc3RyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN1clN0ciA9IHN0ci50b1N0
cmluZygpOwogICAgICAgIH0KCiAgICAgICAgLy8gTG9vayB1cCB0aGUgc3RyaW5nIG9uIHRoZSBi
YWNraW5nIHN0b3JlCiAgICAgICAgUmVjdCByZWN0ID0gKFJlY3QpIHN0cmluZ0xvY2F0aW9ucy5n
ZXQoY3VyU3RyKTsKCiAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBS
YXN0ZXJpemUgdGhpcyBzdHJpbmcgYW5kIHBsYWNlIGl0IG9uIHRoZSBiYWNraW5nIHN0b3JlCiAg
ICAgICAgICAgIEdyYXBoaWNzMkQgZyA9IGdldEdyYXBoaWNzMkQoKTsKICAgICAgICAgICAgUmVj
dGFuZ2xlMkQgb3JpZ0JCb3ggPSBwcmVOb3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRz
KGN1clN0ciwgZm9udCwgZ2V0Rm9udFJlbmRlckNvbnRleHQoKSkpOwogICAgICAgICAgICBSZWN0
YW5nbGUyRCBiYm94ID0gbm9ybWFsaXplKG9yaWdCQm94KTsKICAgICAgICAgICAgUG9pbnQgb3Jp
Z2luID0gbmV3IFBvaW50KChpbnQpIC1iYm94LmdldE1pblgoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChpbnQpIC1iYm94LmdldE1pblkoKSk7CiAgICAgICAgICAgIHJl
Y3QgPSBuZXcgUmVjdCgwLCAwLCAoaW50KSBiYm94LmdldFdpZHRoKCksCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoaW50KSBiYm94LmdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3IFRleHREYXRhKGN1clN0ciwgb3JpZ2luLCBvcmlnQkJveCwgLTEpKTsKCiAg
ICAgICAgICAgIHBhY2tlci5hZGQocmVjdCk7CiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5w
dXQoY3VyU3RyLCByZWN0KTsKCiAgICAgICAgICAgIC8vIFJlLWZldGNoIHRoZSBHcmFwaGljczJE
IGluIGNhc2UgdGhlIGFkZGl0aW9uIG9mIHRoZSByZWN0YW5nbGUKICAgICAgICAgICAgLy8gY2F1
c2VkIHRoZSBvbGQgYmFja2luZyBzdG9yZSB0byBiZSB0aHJvd24gYXdheQogICAgICAgICAgICBn
ID0gZ2V0R3JhcGhpY3MyRCgpOwoKICAgICAgICAgICAgLy8gT0ssIHNob3VsZCBub3cgaGF2ZSBh
biAoeCwgeSkgZm9yIHRoaXMgcmVjdGFuZ2xlOyByYXN0ZXJpemUKICAgICAgICAgICAgLy8gdGhl
IFN0cmluZwogICAgICAgICAgICBpbnQgc3RyeCA9IHJlY3QueCgpICsgb3JpZ2luLng7CiAgICAg
ICAgICAgIGludCBzdHJ5ID0gcmVjdC55KCkgKyBvcmlnaW4ueTsKCiAgICAgICAgICAgIC8vIENs
ZWFyIG91dCB0aGUgYXJlYSB3ZSdyZSBnb2luZyB0byBkcmF3IGludG8KICAgICAgICAgICAgZy5z
ZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuQ2xlYXIpOwogICAgICAgICAgICBnLmZpbGxSZWN0
KHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53KCksIHJlY3QuaCgpKTsKICAgICAgICAgICAgZy5z
ZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuU3JjKTsKCiAgICAgICAgICAgIC8vIERyYXcgdGhl
IHN0cmluZwogICAgICAgICAgICByZW5kZXJEZWxlZ2F0ZS5kcmF3KGcsIGN1clN0ciwgc3RyeCwg
c3RyeSk7CgogICAgICAgICAgICBpZiAoRFJBV19CQk9YRVMpIHsKICAgICAgICAgICAgICAgIFRl
eHREYXRhIGRhdGEgPSAoVGV4dERhdGEpIHJlY3QuZ2V0VXNlckRhdGEoKTsKICAgICAgICAgICAg
ICAgIC8vIERyYXcgYSBib3VuZGluZyBib3ggb24gdGhlIGJhY2tpbmcgc3RvcmUKICAgICAgICAg
ICAgICAgIGcuZHJhd1JlY3Qoc3RyeCAtIGRhdGEub3JpZ09yaWdpblgoKSwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3RyeSAtIGRhdGEub3JpZ09yaWdpblkoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGludCkgZGF0YS5vcmlnUmVjdCgpLmdldFdpZHRoKCksCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChpbnQpIGRhdGEub3JpZ1JlY3QoKS5nZXRIZWlnaHQoKSk7CiAgICAg
ICAgICAgICAgICBnLmRyYXdSZWN0KHN0cnggLSBkYXRhLm9yaWdpbigpLngsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0cnkgLSBkYXRhLm9yaWdpbigpLnksCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlY3QudygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmgoKSk7
CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1hcmsgdGhpcyByZWdpb24gb2YgdGhlIFRl
eHR1cmVSZW5kZXJlciBhcyBkaXJ0eQogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5tYXJr
RGlydHkocmVjdC54KCksIHJlY3QueSgpLCByZWN0LncoKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICB9CgogICAgICAgIC8vIE9LLCBu
b3cgZHJhdyB0aGUgcG9ydGlvbiBvZiB0aGUgYmFja2luZyBzdG9yZSB0byB0aGUgc2NyZWVuCiAg
ICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CgogICAg
ICAgIC8vIE5PVEUgdGhhdCB0aGUgcmVjdGFuZ2xlcyBtYW5hZ2VkIGJ5IHRoZSBwYWNrZXIgaGF2
ZSB0aGVpcgogICAgICAgIC8vIG9yaWdpbiBhdCB0aGUgdXBwZXItbGVmdCBidXQgdGhlIFRleHR1
cmVSZW5kZXJlcidzIG9yaWdpbiBpcwogICAgICAgIC8vIGF0IGl0cyBsb3dlciBsZWZ0ISEhCiAg
ICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwogICAg
ICAgIGRhdGEubWFya1VzZWQoKTsKCiAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QgPSBkYXRh
Lm9yaWdSZWN0KCk7CiAgICAgICAgCiAgICAgICAgLy8gQWxpZ24gdGhlIGxlZnRtb3N0IHBvaW50
IG9mIHRoZSBiYXNlbGluZSB0byB0aGUgKHgsIHksIHopIGNvb3JkaW5hdGUgcmVxdWVzdGVkCiAg
ICAgICAgcmVuZGVyZXIuZHJhdzNEUmVjdCh4IC0gKHNjYWxlRmFjdG9yICogZGF0YS5vcmlnT3Jp
Z2luWCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLSAoc2NhbGVGYWN0b3IgKiAo
KGZsb2F0KSBvcmlnUmVjdC5nZXRIZWlnaHQoKSAtIGRhdGEub3JpZ09yaWdpblkoKSkpLCB6LAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC54KCkgKyAoZGF0YS5vcmlnaW4oKS54IC0g
ZGF0YS5vcmlnT3JpZ2luWCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVy
LmdldEhlaWdodCgpIC0gcmVjdC55KCkgLSAoaW50KSBvcmlnUmVjdC5nZXRIZWlnaHQoKSAtCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhLm9yaWdpbigpLnkgLSBkYXRhLm9yaWdP
cmlnaW5ZKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgb3JpZ1JlY3QuZ2V0
V2lkdGgoKSwgKGludCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCksIHNjYWxlRmFjdG9yKTsKICAgIH0K
CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIERlYnVnZ2luZyBmdW5jdGlvbmFsaXR5CiAgICAv
LwogICAgcHJpdmF0ZSB2b2lkIGRlYnVnKCkgewogICAgICAgIGRiZ0ZyYW1lID0gbmV3IEZyYW1l
KCJUZXh0UmVuZGVyZXIgRGVidWcgT3V0cHV0Iik7CgogICAgICAgIEdMQ2FudmFzIGRiZ0NhbnZh
cyA9IG5ldyBHTENhbnZhcyhuZXcgR0xDYXBhYmlsaXRpZXMoKSwgbnVsbCwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xDb250ZXh0LmdldEN1cnJlbnQoKSwgbnVs
bCk7CiAgICAgICAgZGJnQ2FudmFzLmFkZEdMRXZlbnRMaXN0ZW5lcihuZXcgRGVidWdMaXN0ZW5l
cihkYmdGcmFtZSkpOwogICAgICAgIGRiZ0ZyYW1lLmFkZChkYmdDYW52YXMpOwoKICAgICAgICBm
aW5hbCBGUFNBbmltYXRvciBhbmltID0gbmV3IEZQU0FuaW1hdG9yKGRiZ0NhbnZhcywgMTApOwog
ICAgICAgIGRiZ0ZyYW1lLmFkZFdpbmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkgewog
ICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7
CiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHRoaXMgb24gYW5vdGhlciB0aHJlYWQgdGhhbiB0
aGUgQVdUIGV2ZW50IHF1ZXVlIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRo
ZSBjYWxsIHRvIEFuaW1hdG9yLnN0b3AoKSBjb21wbGV0ZXMgYmVmb3JlCiAgICAgICAgICAgICAg
ICAgICAgLy8gZXhpdGluZwogICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5h
YmxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RvcCgpOwogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KS5zdGFydCgpOwogICAg
ICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICBkYmdGcmFtZS5zZXRTaXplKGtT
aXplLCBrU2l6ZSk7CiAgICAgICAgZGJnRnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKICAgICAgICBh
bmltLnN0YXJ0KCk7CiAgICAgICAgZGVidWdnZWQgPSB0cnVlOwogICAgfQoKICAgIC8qKiBDbGFz
cyBzdXBwb3J0aW5nIG1vcmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIHByb2Nlc3Mgb2YgcmVuZGVy
aW5nCiAgICAgICAgdGhlIGJpdG1hcHBlZCB0ZXh0LiBBbGxvd3MgY3VzdG9taXphdGlvbiBvZiB3
aGV0aGVyIHRoZSBiYWNraW5nCiAgICAgICAgc3RvcmUgdGV4dCBiaXRtYXAgaXMgZnVsbC1jb2xv
ciBvciBpbnRlbnNpdHkgb25seSwgdGhlIHNpemUgb2YKICAgICAgICBlYWNoIGluZGl2aWR1YWwg
cmVuZGVyZWQgdGV4dCByZWN0YW5nbGUsIGFuZCB0aGUgY29udGVudHMgb2YKICAgICAgICBlYWNo
IGluZGl2aWR1YWwgcmVuZGVyZWQgdGV4dCBzdHJpbmcuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0
aW9uCiAgICAgICAgb2YgdGhpcyBpbnRlcmZhY2UgdXNlcyBhbiBpbnRlbnNpdHktb25seSB0ZXh0
dXJlLCBhCiAgICAgICAgY2xvc2VseS1jcm9wcGVkIHJlY3RhbmdsZSBhcm91bmQgdGhlIHRleHQs
IGFuZCByZW5kZXJzIHRleHQKICAgICAgICB1c2luZyB0aGUgY29sb3Igd2hpdGUsIHdoaWNoIGlz
IG1vZHVsYXRlZCBieSB0aGUgc2V0IGNvbG9yCiAgICAgICAgZHVyaW5nIHRoZSByZW5kZXJpbmcg
cHJvY2Vzcy4gKi8KICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlbmRlckRlbGVnYXRlIHsK
ICAgICAgICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJhY2tpbmcgc3RvcmUgb2YgdGhpcyBU
ZXh0UmVuZGVyZXIKICAgICAgICAgICAgc2hvdWxkIGJlIGludGVuc2l0eS1vbmx5ICh0aGUgZGVm
YXVsdCkgb3IgZnVsbC1jb2xvci4gKi8KICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlbnNpdHlP
bmx5KCk7CgogICAgICAgIC8qKiBDb21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBTdHJp
bmcgcmVsYXRpdmUgdG8gdGhlCiAgICAgICAgICAgIG9yaWdpbi4gKi8KICAgICAgICBwdWJsaWMg
UmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKFN0cmluZyBzdHIsIEZvbnQgZm9udCwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7CgogICAgICAg
IC8qKiBDb21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc2VxdWVuY2Ug
cmVsYXRpdmUKICAgICAgICAgICAgdG8gdGhlIG9yaWdpbi4gKi8KICAgICAgICBwdWJsaWMgUmVj
dGFuZ2xlMkQgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7CgogICAg
ICAgIC8qKiBDb21wdXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBHbHlwaFZlY3RvciwgYWxy
ZWFkeQogICAgICAgICAgICBhc3N1bWVkIHRvIGhhdmUgYmVlbiBjcmVhdGVkIGZvciBhIHBhcnRp
Y3VsYXIgRm9udCwKICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbi4gKi8KICAgICAg
ICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKEdseXBoVmVjdG9yIGd2LCBGb250UmVuZGVy
Q29udGV4dCBmcmMpOwoKICAgICAgICAvKiogUmVuZGVyIHRoZSBwYXNzZWQgY2hhcmFjdGVyIHNl
cXVlbmNlIGF0IHRoZSBkZXNpZ25hdGVkCiAgICAgICAgICAgIGxvY2F0aW9uIHVzaW5nIHRoZSBz
dXBwbGllZCBHcmFwaGljczJEIGluc3RhbmNlLiBUaGUKICAgICAgICAgICAgc3Vycm91bmRpbmcg
cmVnaW9uIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gY2xlYXJlZCB0byB0aGUgUkdCCiAgICAgICAg
ICAgIGNvbG9yICgwLCAwLCAwKSB3aXRoIHplcm8gYWxwaGEuIFRoZSBpbml0aWFsIGRyYXdpbmcg
Y29udGV4dAogICAgICAgICAgICBvZiB0aGUgcGFzc2VkIEdyYXBoaWNzMkQgd2lsbCBiZSBzZXQg
dG8gdXNlCiAgICAgICAgICAgIEFscGhhQ29tcG9zaXRlLlNyYywgdGhlIGNvbG9yIHdoaXRlLCB0
aGUgRm9udCBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgIFRleHRSZW5kZXJlcidzIGNvbnN0
cnVjdG9yLCBhbmQgdGhlIHJlbmRlcmluZyBoaW50cyBzcGVjaWZpZWQKICAgICAgICAgICAgaW4g
dGhlIFRleHRSZW5kZXJlciBjb25zdHJ1Y3Rvci4gIENoYW5nZXMgbWFkZSBieSB0aGUgZW5kIHVz
ZXIKICAgICAgICAgICAgbWF5IGJlIHZpc2libGUgaW4gc3VjY2Vzc2l2ZSBjYWxscyB0byB0aGlz
IG1ldGhvZCwgYnV0IGFyZSBub3QKICAgICAgICAgICAgZ3VhcmFudGVlZCB0byBiZSBwcmVzZXJ2
ZWQuICBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2QKICAgICAgICAgICAgc2hvdWxkIHJlc2V0
IHRoZSBHcmFwaGljczJEJ3Mgc3RhdGUgdG8gdGhhdCBkZXNpcmVkIGVhY2ggdGltZQogICAgICAg
ICAgICB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGluIHBhcnRpY3VsYXIgdGhvc2Ugc3RhdGVzIHdo
aWNoIGFyZQogICAgICAgICAgICBub3QgdGhlIGRlZmF1bHRzLiAqLwogICAgICAgIHB1YmxpYyB2
b2lkIGRyYXcoR3JhcGhpY3MyRCBncmFwaGljcywgU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KTsK
CiAgICAgICAgLyoqIFJlbmRlciB0aGUgcGFzc2VkIEdseXBoVmVjdG9yIGF0IHRoZSBkZXNpZ25h
dGVkIGxvY2F0aW9uIHVzaW5nCiAgICAgICAgICAgIHRoZSBzdXBwbGllZCBHcmFwaGljczJEIGlu
c3RhbmNlLiBUaGUgc3Vycm91bmRpbmcgcmVnaW9uIHdpbGwKICAgICAgICAgICAgYWxyZWFkeSBo
YXZlIGJlZW4gY2xlYXJlZCB0byB0aGUgUkdCIGNvbG9yICgwLCAwLCAwKSB3aXRoIHplcm8KICAg
ICAgICAgICAgYWxwaGEuIFRoZSBpbml0aWFsIGRyYXdpbmcgY29udGV4dCBvZiB0aGUgcGFzc2Vk
IEdyYXBoaWNzMkQKICAgICAgICAgICAgd2lsbCBiZSBzZXQgdG8gdXNlIEFscGhhQ29tcG9zaXRl
LlNyYywgdGhlIGNvbG9yIHdoaXRlLCB0aGUKICAgICAgICAgICAgRm9udCBzcGVjaWZpZWQgaW4g
dGhlIFRleHRSZW5kZXJlcidzIGNvbnN0cnVjdG9yLCBhbmQgdGhlCiAgICAgICAgICAgIHJlbmRl
cmluZyBoaW50cyBzcGVjaWZpZWQgaW4gdGhlIFRleHRSZW5kZXJlciBjb25zdHJ1Y3Rvci4KICAg
ICAgICAgICAgQ2hhbmdlcyBtYWRlIGJ5IHRoZSBlbmQgdXNlciBtYXkgYmUgdmlzaWJsZSBpbiBz
dWNjZXNzaXZlCiAgICAgICAgICAgIGNhbGxzIHRvIHRoaXMgbWV0aG9kLCBidXQgYXJlIG5vdCBn
dWFyYW50ZWVkIHRvIGJlIHByZXNlcnZlZC4KICAgICAgICAgICAgSW1wbGVtZW50b3JzIG9mIHRo
aXMgbWV0aG9kIHNob3VsZCByZXNldCB0aGUgR3JhcGhpY3MyRCdzCiAgICAgICAgICAgIHN0YXRl
IHRvIHRoYXQgZGVzaXJlZCBlYWNoIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpbgogICAg
ICAgICAgICBwYXJ0aWN1bGFyIHRob3NlIHN0YXRlcyB3aGljaCBhcmUgbm90IHRoZSBkZWZhdWx0
cy4gKi8KICAgICAgICBwdWJsaWMgdm9pZCBkcmF3R2x5cGhWZWN0b3IoR3JhcGhpY3MyRCBncmFw
aGljcywgR2x5cGhWZWN0b3Igc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpbnQgeCwgaW50IHkpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYXJTZXF1
ZW5jZUl0ZXJhdG9yIGltcGxlbWVudHMgQ2hhcmFjdGVySXRlcmF0b3IgewogICAgICAgIENoYXJT
ZXF1ZW5jZSBtU2VxdWVuY2U7CiAgICAgICAgaW50IG1MZW5ndGg7CiAgICAgICAgaW50IG1DdXJy
ZW50SW5kZXg7CgogICAgICAgIENoYXJTZXF1ZW5jZUl0ZXJhdG9yKCkgewogICAgICAgIH0KCiAg
ICAgICAgQ2hhclNlcXVlbmNlSXRlcmF0b3IoQ2hhclNlcXVlbmNlIHNlcXVlbmNlKSB7CiAgICAg
ICAgICAgIGluaXRGcm9tQ2hhclNlcXVlbmNlKHNlcXVlbmNlKTsKICAgICAgICB9CgogICAgICAg
IHB1YmxpYyB2b2lkIGluaXRGcm9tQ2hhclNlcXVlbmNlKENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSkg
ewogICAgICAgICAgICBtU2VxdWVuY2UgPSBzZXF1ZW5jZTsKICAgICAgICAgICAgbUxlbmd0aCA9
IG1TZXF1ZW5jZS5sZW5ndGgoKTsKICAgICAgICAgICAgbUN1cnJlbnRJbmRleCA9IDA7CiAgICAg
ICAgfQoKICAgICAgICBwdWJsaWMgY2hhciBsYXN0KCkgewogICAgICAgICAgICBtQ3VycmVudElu
ZGV4ID0gTWF0aC5tYXgoMCwgbUxlbmd0aCAtIDEpOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJl
bnQoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFyIGN1cnJlbnQoKSB7CiAgICAgICAg
ICAgIGlmICgobUxlbmd0aCA9PSAwKSB8fCAobUN1cnJlbnRJbmRleCA+PSBtTGVuZ3RoKSkgewog
ICAgICAgICAgICAgICAgcmV0dXJuIENoYXJhY3Rlckl0ZXJhdG9yLkRPTkU7CiAgICAgICAgICAg
IH0KCiAgICAgICAgICAgIHJldHVybiBtU2VxdWVuY2UuY2hhckF0KG1DdXJyZW50SW5kZXgpOwog
ICAgICAgIH0KCiAgICAgICAgcHVibGljIGNoYXIgbmV4dCgpIHsKICAgICAgICAgICAgbUN1cnJl
bnRJbmRleCsrOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQoKTsKICAgICAgICB9CgogICAg
ICAgIHB1YmxpYyBjaGFyIHByZXZpb3VzKCkgewogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0g
TWF0aC5tYXgobUN1cnJlbnRJbmRleCAtIDEsIDApOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJl
bnQoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFyIHNldEluZGV4KGludCBwb3NpdGlv
bikgewogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0gcG9zaXRpb247CgogICAgICAgICAgICBy
ZXR1cm4gY3VycmVudCgpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBnZXRCZWdpbklu
ZGV4KCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBp
bnQgZ2V0RW5kSW5kZXgoKSB7CiAgICAgICAgICAgIHJldHVybiBtTGVuZ3RoOwogICAgICAgIH0K
CiAgICAgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKICAgICAgICAgICAgcmV0dXJuIG1DdXJy
ZW50SW5kZXg7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAg
ICAgICAgICBDaGFyU2VxdWVuY2VJdGVyYXRvciBpdGVyID0gbmV3IENoYXJTZXF1ZW5jZUl0ZXJh
dG9yKG1TZXF1ZW5jZSk7CiAgICAgICAgICAgIGl0ZXIubUN1cnJlbnRJbmRleCA9IG1DdXJyZW50
SW5kZXg7CgogICAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9CgogICAgICAgIHB1Ymxp
YyBjaGFyIGZpcnN0KCkgewogICAgICAgICAgICBpZiAobUxlbmd0aCA9PSAwKSB7CiAgICAgICAg
ICAgICAgICByZXR1cm4gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORTsKICAgICAgICAgICAgfQoKICAg
ICAgICAgICAgbUN1cnJlbnRJbmRleCA9IDA7CgogICAgICAgICAgICByZXR1cm4gY3VycmVudCgp
OwogICAgICAgIH0KICAgIH0KCiAgICAvLyBEYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHJlY3Rh
bmdsZSBvZiB0ZXh0CiAgICBzdGF0aWMgY2xhc3MgVGV4dERhdGEgewogICAgICAgIC8vIEJhY2st
cG9pbnRlciB0byBTdHJpbmcgdGhpcyBUZXh0RGF0YSBkZXNjcmliZXMsIGlmIGl0CiAgICAgICAg
Ly8gcmVwcmVzZW50cyBhIFN0cmluZyByYXRoZXIgdGhhbiBhIHNpbmdsZSBnbHlwaAogICAgICAg
IHByaXZhdGUgU3RyaW5nIHN0cjsKCiAgICAgICAgLy8gSWYgdGhpcyBUZXh0RGF0YSByZXByZXNl
bnRzIGEgc2luZ2xlIGdseXBoLCB0aGlzIGlzIGl0cwogICAgICAgIC8vIHVuaWNvZGUgSUQKICAg
ICAgICBpbnQgdW5pY29kZUlEOwoKICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG11c3QgYmUgZGVm
aW5lZCBhbmQgdXNlZCBWRVJZIHByZWNpc2VseS4gVGhpcyBpcwogICAgICAgIC8vIHRoZSBvZmZz
ZXQgZnJvbSB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhpcyByZWN0YW5nbGUgKEphdmEKICAg
ICAgICAvLyAyRCBjb29yZGluYXRlIHN5c3RlbSkgYXQgd2hpY2ggdGhlIHN0cmluZyBtdXN0IGJl
IHJhc3Rlcml6ZWQgaW4KICAgICAgICAvLyBvcmRlciB0byBmaXQgd2l0aGluIHRoZSByZWN0YW5n
bGUgLS0gdGhlIGxlZnRtb3N0IHBvaW50IG9mIHRoZQogICAgICAgIC8vIGJhc2VsaW5lLgogICAg
ICAgIHByaXZhdGUgUG9pbnQgb3JpZ2luOwoKICAgICAgICAvLyBUaGlzIHJlcHJlc2VudHMgdGhl
IHByZS1ub3JtYWxpemVkIHJlY3RhbmdsZSwgd2hpY2ggZml0cwogICAgICAgIC8vIHdpdGhpbiB0
aGUgcmVjdGFuZ2xlIG9uIHRoZSBiYWNraW5nIHN0b3JlLiBXZSBrZWVwIGEKICAgICAgICAvLyBv
bmUtcGl4ZWwgYm9yZGVyIGFyb3VuZCBlbnRyaWVzIG9uIHRoZSBiYWNraW5nIHN0b3JlIHRvCiAg
ICAgICAgLy8gcHJldmVudCBibGVlZGluZyBvZiBhZGphY2VudCBsZXR0ZXJzIHdoZW4gdXNpbmcg
R0xfTElORUFSCiAgICAgICAgLy8gZmlsdGVyaW5nIGZvciByZW5kZXJpbmcuIFRoZSBvcmlnaW4g
b2YgdGhpcyByZWN0YW5nbGUgaXMKICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW4g
YWJvdmUuCiAgICAgICAgcHJpdmF0ZSBSZWN0YW5nbGUyRCBvcmlnUmVjdDsKCiAgICAgICAgcHJp
dmF0ZSBib29sZWFuIHVzZWQ7IC8vIFdoZXRoZXIgdGhpcyB0ZXh0IHdhcyB1c2VkIHJlY2VudGx5
CgogICAgICAgIFRleHREYXRhKFN0cmluZyBzdHIsIFBvaW50IG9yaWdpbiwgUmVjdGFuZ2xlMkQg
b3JpZ1JlY3QsIGludCB1bmljb2RlSUQpIHsKICAgICAgICAgICAgdGhpcy5zdHIgPSBzdHI7CiAg
ICAgICAgICAgIHRoaXMub3JpZ2luID0gb3JpZ2luOwogICAgICAgICAgICB0aGlzLm9yaWdSZWN0
ID0gb3JpZ1JlY3Q7CiAgICAgICAgICAgIHRoaXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAg
ICAgIH0KCiAgICAgICAgU3RyaW5nIHN0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cjsK
ICAgICAgICB9CgogICAgICAgIFBvaW50IG9yaWdpbigpIHsKICAgICAgICAgICAgcmV0dXJuIG9y
aWdpbjsKICAgICAgICB9CgogICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcyBh
cmUgdXNlZCB0byBsb2NhdGUgdGhlIGdseXBoCiAgICAgICAgLy8gd2l0aGluIHRoZSBleHBhbmRl
ZCByZWN0YW5nbGUgY29taW5nIGZyb20gbm9ybWFsaXplKCkKICAgICAgICBpbnQgb3JpZ09yaWdp
blgoKSB7CiAgICAgICAgICAgIHJldHVybiAoaW50KSAtb3JpZ1JlY3QuZ2V0TWluWCgpOwogICAg
ICAgIH0KCiAgICAgICAgaW50IG9yaWdPcmlnaW5ZKCkgewogICAgICAgICAgICByZXR1cm4gKGlu
dCkgLW9yaWdSZWN0LmdldE1pblkoKTsKICAgICAgICB9CgogICAgICAgIFJlY3RhbmdsZTJEIG9y
aWdSZWN0KCkgewogICAgICAgICAgICByZXR1cm4gb3JpZ1JlY3Q7CiAgICAgICAgfQoKICAgICAg
ICBib29sZWFuIHVzZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB1c2VkOwogICAgICAgIH0KCiAg
ICAgICAgdm9pZCBtYXJrVXNlZCgpIHsKICAgICAgICAgICAgdXNlZCA9IHRydWU7CiAgICAgICAg
fQoKICAgICAgICB2b2lkIGNsZWFyVXNlZCgpIHsKICAgICAgICAgICAgdXNlZCA9IGZhbHNlOwog
ICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBNYW5hZ2VyIGltcGxlbWVudHMgQmFja2luZ1N0b3Jl
TWFuYWdlciB7CiAgICAgICAgcHJpdmF0ZSBHcmFwaGljczJEIGc7CgogICAgICAgIHB1YmxpYyBP
YmplY3QgYWxsb2NhdGVCYWNraW5nU3RvcmUoaW50IHcsIGludCBoKSB7CiAgICAgICAgICAgIC8v
IEZJWE1FOiBzaG91bGQgY29uc2lkZXIgY2hlY2tpbmcgRm9udCdzIGF0dHJpYnV0ZXMgdG8gc2Vl
CiAgICAgICAgICAgIC8vIHdoZXRoZXIgd2UncmUgbGlrZWx5IHRvIG5lZWQgdG8gc3VwcG9ydCBh
IGZ1bGwgUkdCQSBiYWNraW5nCiAgICAgICAgICAgIC8vIHN0b3JlIChpLmUuLCBub24tZGVmYXVs
dCBQYWludCwgZm9yZWdyb3VuZCBjb2xvciwgZXRjLiksIGJ1dAogICAgICAgICAgICAvLyBmb3Ig
bm93LCBsZXQncyBqdXN0IGJlIG1vcmUgZWZmaWNpZW50CiAgICAgICAgICAgIFRleHR1cmVSZW5k
ZXJlciByZW5kZXJlcjsKCiAgICAgICAgICAgIGlmIChyZW5kZXJEZWxlZ2F0ZS5pbnRlbnNpdHlP
bmx5KCkpIHsKICAgICAgICAgICAgICAgIHJlbmRlcmVyID0gVGV4dHVyZVJlbmRlcmVyLmNyZWF0
ZUFscGhhT25seVJlbmRlcmVyKHcsIGgsIG1pcG1hcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAg
ICAgICAgICAgICAgICByZW5kZXJlciA9IG5ldyBUZXh0dXJlUmVuZGVyZXIodywgaCwgdHJ1ZSwg
bWlwbWFwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZW5kZXJlci5zZXRTbW9vdGhpbmco
c21vb3RoaW5nKTsKCiAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgU3lz
dGVtLmVyci5wcmludGxuKCIgVGV4dFJlbmRlcmVyIGFsbG9jYXRpbmcgYmFja2luZyBzdG9yZSAi
ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICsgIiB4ICIgKyBoKTsKICAg
ICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwogICAgICAgIH0KCiAgICAg
ICAgcHVibGljIHZvaWQgZGVsZXRlQmFja2luZ1N0b3JlKE9iamVjdCBiYWNraW5nU3RvcmUpIHsK
ICAgICAgICAgICAgKChUZXh0dXJlUmVuZGVyZXIpIGJhY2tpbmdTdG9yZSkuZGlzcG9zZSgpOwog
ICAgICAgIH0KCiAgICAgICAgcHVibGljIGJvb2xlYW4gcHJlRXhwYW5kKFJlY3QgY2F1c2UsIGlu
dCBhdHRlbXB0TnVtYmVyKSB7CiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRoaXMgb25lIHRpbWU7
IGNsZWFyIG91dCBwb3RlbnRpYWxseSBvYnNvbGV0ZSBlbnRyaWVzCiAgICAgICAgICAgIC8vIE5P
VEU6IHRoaXMgaGV1cmlzdGljIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGNsZWFycyB0aGUgdXNlZCBi
aXQKICAgICAgICAgICAgLy8gb2YgYWxsIGVudHJpZXMgc2VlbXMgdG8gY2F1c2UgY3ljbGluZyBv
ZiBlbnRyaWVzIGluIHNvbWUKICAgICAgICAgICAgLy8gc2l0dWF0aW9ucywgd2hlcmUgdGhlIGJh
Y2tpbmcgc3RvcmUgYmVjb21lcyBzbWFsbCBjb21wYXJlZCB0bwogICAgICAgICAgICAvLyB0aGUg
YW1vdW50IG9mIHRleHQgb24gdGhlIHNjcmVlbiAoc2VlIHRoZSBUZXh0RmxvdyBkZW1vKSBhbmQK
ICAgICAgICAgICAgLy8gdGhlIGVudHJpZXMgY29udGludWFsbHkgY3ljbGUgaW4gYW5kIG91dCBv
ZiB0aGUgYmFja2luZwogICAgICAgICAgICAvLyBzdG9yZSwgZGVjcmVhc2luZyBwZXJmb3JtYW5j
ZS4gSWYgd2UgYWRkZWQgYSBsaXR0bGUgYWdlCiAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIHRv
IHRoZSBlbnRyaWVzLCBhbmQgb25seSBjbGVhcmVkIG91dCBlbnRyaWVzCiAgICAgICAgICAgIC8v
IGFib3ZlIGEgY2VydGFpbiBhZ2UsIHRoaXMgYmVoYXZpb3Igd291bGQgYmUgZWxpbWluYXRlZC4K
ICAgICAgICAgICAgLy8gSG93ZXZlciwgaXQgc2VlbXMgdGhlIHN5c3RlbSB1c3VhbGx5IHN0YWJp
bGl6ZXMgaXRzZWxmLCBzbwogICAgICAgICAgICAvLyBmb3Igbm93IHdlJ2xsIGp1c3Qga2VlcCB0
aGluZ3Mgc2ltcGxlLiBOb3RlIHRoYXQgaWYgd2UgZG9uJ3QKICAgICAgICAgICAgLy8gY2xlYXIg
dGhlIHVzZWQgYml0IGhlcmUsIHRoZSBiYWNraW5nIHN0b3JlIHRlbmRzIHRvIGluY3JlYXNlCiAg
ICAgICAgICAgIC8vIHZlcnkgcXVpY2tseSB0byBpdHMgbWF4aW11bSBzaXplLCBhdCBsZWFzdCB3
aXRoIHRoZSBUZXh0RmxvdwogICAgICAgICAgICAvLyBkZW1vIHdoZW4gdGhlIHRleHQgaXMgYmVp
bmcgY29udGludWFsbHkgcmUtbGFpZCBvdXQuCiAgICAgICAgICAgIGlmIChhdHRlbXB0TnVtYmVy
ID09IDApIHsKICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAg
IFN5c3RlbS5lcnIucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgIkNsZWFyaW5nIHVu
dXNlZCBlbnRyaWVzIGluIHByZUV4cGFuZCgpOiBhdHRlbXB0IG51bWJlciAiICsKICAgICAgICAg
ICAgICAgICAgICAgICAgYXR0ZW1wdE51bWJlcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAg
ICAgICAgICAgaWYgKGluQmVnaW5FbmRQYWlyKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRHJh
dyBhbnkgb3V0c3RhbmRpbmcgZ2x5cGhzCiAgICAgICAgICAgICAgICAgICAgZmx1c2goKTsKICAg
ICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGVhclVudXNlZEVudHJpZXMoKTsKCiAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgYWRkaXRpb25GYWlsZWQo
UmVjdCBjYXVzZSwgaW50IGF0dGVtcHROdW1iZXIpIHsKICAgICAgICAgICAgLy8gSGVhdnkgaGFt
bWVyIC0tIG1pZ2h0IGNvbnNpZGVyIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnQKICAgICAgICAg
ICAgcGFja2VyLmNsZWFyKCk7CiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5jbGVhcigpOwog
ICAgICAgICAgICBtR2x5cGhQcm9kdWNlci5jbGVhckFsbENhY2hlRW50cmllcygpOwoKICAgICAg
ICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAqKiogQ2xlYXJlZCBhbGwgdGV4dCBi
ZWNhdXNlIGFkZGl0aW9uIGZhaWxlZCAqKioiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAg
ICAgICAgcHVibGljIHZvaWQgYmVnaW5Nb3ZlbWVudChPYmplY3Qgb2xkQmFja2luZ1N0b3JlLCBP
YmplY3QgbmV3QmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgIC8vIEV4aXQgdGhlIGJlZ2luIC8g
ZW5kIHBhaXIgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewog
ICAgICAgICAgICAgICAgLy8gRHJhdyBhbnkgb3V0c3RhbmRpbmcgZ2x5cGhzCiAgICAgICAgICAg
ICAgICBmbHVzaCgpOwoKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgp
OwoKICAgICAgICAgICAgICAgIC8vIFBvcCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUg
cGlwZWxpbmVkIHF1YWQgcmVuZGVyZXIKICAgICAgICAgICAgICAgIGdsLmdsUG9wQ2xpZW50QXR0
cmliKCk7CgogICAgICAgICAgICAgICAgLy8gVGhlIE9wZW5HTCBzcGVjIGlzIHVuY2xlYXIgYWJv
dXQgd2hldGhlciB0aGlzIGNoYW5nZXMgdGhlCiAgICAgICAgICAgICAgICAvLyBidWZmZXIgYmlu
ZGluZ3MsIHNvIHByZWVtcHRpdmVseSB6ZXJvIG91dCB0aGUgR0xfQVJSQVlfQlVGRkVSCiAgICAg
ICAgICAgICAgICAvLyBiaW5kaW5nCiAgICAgICAgICAgICAgICBpZiAoaXNWQk9BdmFpbGFibGUo
Z2wpKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAg
Z2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7CiAgICAgICAgICAgICAgICAg
ICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRl
bnNpb25BdmFpbGFibGVfVkJPID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpc09ydGhvTW9kZSkgewogICAgICAgICAg
ICAgICAgICAgICgoVGV4dHVyZVJlbmRlcmVyKSBvbGRCYWNraW5nU3RvcmUpLmVuZE9ydGhvUmVu
ZGVyaW5nKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICgo
VGV4dHVyZVJlbmRlcmVyKSBvbGRCYWNraW5nU3RvcmUpLmVuZDNEUmVuZGVyaW5nKCk7CiAgICAg
ICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBu
ZXdSZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZTsKICAgICAgICAg
ICAgZyA9IG5ld1JlbmRlcmVyLmNyZWF0ZUdyYXBoaWNzKCk7CiAgICAgICAgfQoKICAgICAgICBw
dWJsaWMgdm9pZCBtb3ZlKE9iamVjdCBvbGRCYWNraW5nU3RvcmUsIFJlY3Qgb2xkTG9jYXRpb24s
CiAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbmV3QmFja2luZ1N0b3JlLCBSZWN0IG5l
d0xvY2F0aW9uKSB7CiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBvbGRSZW5kZXJlciA9IChU
ZXh0dXJlUmVuZGVyZXIpIG9sZEJhY2tpbmdTdG9yZTsKICAgICAgICAgICAgVGV4dHVyZVJlbmRl
cmVyIG5ld1JlbmRlcmVyID0gKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlOwoKICAg
ICAgICAgICAgaWYgKG9sZFJlbmRlcmVyID09IG5ld1JlbmRlcmVyKSB7CiAgICAgICAgICAgICAg
ICAvLyBNb3ZlbWVudCBvbiB0aGUgc2FtZSBiYWNraW5nIHN0b3JlIC0tIGVhc3kgY2FzZQogICAg
ICAgICAgICAgICAgZy5jb3B5QXJlYShvbGRMb2NhdGlvbi54KCksIG9sZExvY2F0aW9uLnkoKSwg
b2xkTG9jYXRpb24udygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2NhdGlvbi5o
KCksIG5ld0xvY2F0aW9uLngoKSAtIG9sZExvY2F0aW9uLngoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3TG9jYXRpb24ueSgpIC0gb2xkTG9jYXRpb24ueSgpKTsKICAgICAgICAgICAg
fSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gZHJhdyBmcm9tIHRoZSBvbGQgcmVu
ZGVyZXIncyBpbWFnZSBpbnRvIHRoZSBuZXcgb25lCiAgICAgICAgICAgICAgICBJbWFnZSBpbWcg
PSBvbGRSZW5kZXJlci5nZXRJbWFnZSgpOwogICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1n
LCBuZXdMb2NhdGlvbi54KCksIG5ld0xvY2F0aW9uLnkoKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG5ld0xvY2F0aW9uLngoKSArIG5ld0xvY2F0aW9uLncoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG5ld0xvY2F0aW9uLnkoKSArIG5ld0xvY2F0aW9uLmgoKSwgb2xkTG9jYXRp
b24ueCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9jYXRpb24ueSgpLCBvbGRM
b2NhdGlvbi54KCkgKyBvbGRMb2NhdGlvbi53KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBvbGRMb2NhdGlvbi55KCkgKyBvbGRMb2NhdGlvbi5oKCksIG51bGwpOwogICAgICAgICAgICB9
CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBlbmRNb3ZlbWVudChPYmplY3Qgb2xkQmFj
a2luZ1N0b3JlLCBPYmplY3QgbmV3QmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgIGcuZGlzcG9z
ZSgpOwoKICAgICAgICAgICAgLy8gU3luYyB0aGUgd2hvbGUgc3VyZmFjZQogICAgICAgICAgICBU
ZXh0dXJlUmVuZGVyZXIgbmV3UmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBuZXdCYWNraW5n
U3RvcmU7CiAgICAgICAgICAgIG5ld1JlbmRlcmVyLm1hcmtEaXJ0eSgwLCAwLCBuZXdSZW5kZXJl
ci5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVuZGVy
ZXIuZ2V0SGVpZ2h0KCkpOwoKICAgICAgICAgICAgLy8gUmUtZW50ZXIgdGhlIGJlZ2luIC8gZW5k
IHBhaXIgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewogICAg
ICAgICAgICAgICAgaWYgKGlzT3J0aG9Nb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgKChUZXh0
dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZSkuYmVnaW5PcnRob1JlbmRlcmluZyhiZWdpblJl
bmRlcmluZ1dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQsIGJl
Z2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsK
ICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5i
ZWdpbjNEUmVuZGVyaW5nKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8g
UHVzaCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUgcGlwZWxpbmVkIHF1YWQgcmVuZGVy
ZXIKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwogICAgICAgICAg
ICAgICAgZ2wuZ2xQdXNoQ2xpZW50QXR0cmliKChpbnQpIEdMLkdMX0FMTF9DTElFTlRfQVRUUklC
X0JJVFMpOwoKICAgICAgICAgICAgICAgIGlmIChoYXZlQ2FjaGVkQ29sb3IpIHsKICAgICAgICAg
ICAgICAgICAgICBpZiAoY2FjaGVkQ29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAg
ICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRS
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjYWNoZWRHLCBjYWNoZWRCLCBjYWNoZWRBKTsKICAgICAgICAgICAgICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikg
bmV3QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRDb2xvcik7CiAgICAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAg
ICAgbmVlZFRvUmVzZXRDb2xvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9
CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0UmVuZGVyRGVsZWdhdGUgaW1wbGVtZW50
cyBSZW5kZXJEZWxlZ2F0ZSB7CiAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZW5zaXR5T25seSgp
IHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgUmVj
dGFuZ2xlMkQgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAg
ICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJT
ZXF1ZW5jZUl0ZXJhdG9yKHN0cikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYyk7
CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKFN0cmluZyBz
dHIsIEZvbnQgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRS
ZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3Jl
YXRlR2x5cGhWZWN0b3IoZnJjLCBzdHIpLCBmcmMpOwogICAgICAgIH0KCiAgICAgICAgcHVibGlj
IFJlY3RhbmdsZTJEIGdldEJvdW5kcyhHbHlwaFZlY3RvciBndiwgRm9udFJlbmRlckNvbnRleHQg
ZnJjKSB7CiAgICAgICAgICAgIHJldHVybiBndi5nZXRWaXN1YWxCb3VuZHMoKTsKICAgICAgICB9
CgogICAgICAgIHB1YmxpYyB2b2lkIGRyYXdHbHlwaFZlY3RvcihHcmFwaGljczJEIGdyYXBoaWNz
LCBHbHlwaFZlY3RvciBzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dCB4LCBpbnQgeSkgewogICAgICAgICAgICBncmFwaGljcy5kcmF3R2x5cGhWZWN0b3Ioc3RyLCB4
LCB5KTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3MyRCBncmFw
aGljcywgU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KSB7CiAgICAgICAgICAgIGdyYXBoaWNzLmRy
YXdTdHJpbmcoc3RyLCB4LCB5KTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CiAgICAvLyBHbHlwaC1ieS1nbHlwaCByZW5kZXJpbmcgc3VwcG9ydAogICAgLy8KCiAgICAvLyBB
IHRlbXBvcmFyeSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBnYXJiYWdlIGNyZWF0aW9uCiAgICBwcml2
YXRlIGNoYXJbXSBzaW5nbGVVbmljb2RlID0gbmV3IGNoYXJbMV07CgogICAgLyoqIEEgR2x5cGgg
cmVwcmVzZW50cyBlaXRoZXIgYSBzaW5nbGUgdW5pY29kZSBnbHlwaCBvciBhCiAgICAgICAgc3Vi
c3RyaW5nIG9mIGNoYXJhY3RlcnMgdG8gYmUgZHJhd24uIFRoZSByZWFzb24gZm9yIHRoZSBkdWFs
CiAgICAgICAgYmVoYXZpb3IgaXMgc28gdGhhdCB3ZSBjYW4gdGFrZSBpbiBhIHNlcXVlbmNlIG9m
IHVuaWNvZGUKICAgICAgICBjaGFyYWN0ZXJzIGFuZCBwYXJ0aXRpb24gdGhlbSBpbnRvIHJ1bnMg
b2YgaW5kaXZpZHVhbCBnbHlwaHMsCiAgICAgICAgYnV0IGlmIHdlIGVuY291bnRlciBjb21wbGV4
IHRleHQgYW5kL29yIHVuaWNvZGUgc2VxdWVuY2VzIHdlCiAgICAgICAgZG9uJ3QgdW5kZXJzdGFu
ZCwgd2UgY2FuIHJlbmRlciB0aGVtIHVzaW5nIHRoZQogICAgICAgIHN0cmluZy1ieS1zdHJpbmcg
bWV0aG9kLiA8UD4KCiAgICAgICAgR2x5cGhzIG5lZWQgdG8gYmUgYWJsZSB0byByZS11cGxvYWQg
dGhlbXNlbHZlcyB0byB0aGUgYmFja2luZwogICAgICAgIHN0b3JlIG9uIGRlbWFuZCBhcyB3ZSBn
byBhbG9uZyBpbiB0aGUgcmVuZGVyIHNlcXVlbmNlLgogICAgKi8KCiAgICBjbGFzcyBHbHlwaCB7
CiAgICAgICAgLy8gSWYgdGhpcyBHbHlwaCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdW5pY29k
ZSBnbHlwaCwgdGhpcwogICAgICAgIC8vIGlzIGl0cyB1bmljb2RlIElELiBJZiBpdCByZXByZXNl
bnRzIGEgU3RyaW5nLCB0aGlzIGlzIC0xLgogICAgICAgIHByaXZhdGUgaW50IHVuaWNvZGVJRDsK
ICAgICAgICAvLyBJZiB0aGUgYWJvdmUgZmllbGQgaXNuJ3QgLTEsIHRoZW4gdGhlc2UgZmllbGRz
IGFyZSB1c2VkLgogICAgICAgIC8vIFRoZSBnbHlwaCBjb2RlIGluIHRoZSBmb250CiAgICAgICAg
cHJpdmF0ZSBpbnQgZ2x5cGhDb2RlOwogICAgICAgIC8vIFRoZSBHbHlwaFByb2R1Y2VyIHdoaWNo
IGNyZWF0ZWQgdXMKICAgICAgICBwcml2YXRlIEdseXBoUHJvZHVjZXIgcHJvZHVjZXI7CiAgICAg
ICAgLy8gVGhlIGFkdmFuY2Ugb2YgdGhpcyBnbHlwaAogICAgICAgIHByaXZhdGUgZmxvYXQgYWR2
YW5jZTsKICAgICAgICAvLyBUaGUgR2x5cGhWZWN0b3IgZm9yIHRoaXMgc2luZ2xlIGNoYXJhY3Rl
cjsgdGhpcyBpcyBwYXNzZWQKICAgICAgICAvLyBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGJ1dCBj
bGVhcmVkIGR1cmluZyB0aGUgdXBsb2FkCiAgICAgICAgLy8gcHJvY2VzcwogICAgICAgIHByaXZh
dGUgR2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUdseXBoVmVjdG9yOwogICAgICAgIC8vIFRoZSBy
ZWN0YW5nbGUgb2YgdGhpcyBnbHlwaCBvbiB0aGUgYmFja2luZyBzdG9yZSwgb3IgbnVsbAogICAg
ICAgIC8vIGlmIGl0IGhhcyBiZWVuIGNsZWFyZWQgZHVlIHRvIHNwYWNlIHByZXNzdXJlCiAgICAg
ICAgcHJpdmF0ZSBSZWN0IGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nOwogICAgICAgIC8vIElm
IHRoaXMgR2x5cGggcmVwcmVzZW50cyBhIFN0cmluZywgdGhpcyBpcyB0aGUgc2VxdWVuY2Ugb2YK
ICAgICAgICAvLyBjaGFyYWN0ZXJzCiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyOwogICAgICAg
IC8vIFdoZXRoZXIgd2UgbmVlZCBhIHZhbGlkIGFkdmFuY2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBz
dHJpbmcKICAgICAgICAvLyAoaS5lLiwgd2hldGhlciBpdCBoYXMgb3RoZXIgc2luZ2xlIGdseXBo
cyBjb21pbmcgYWZ0ZXIgaXQpCiAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRBZHZhbmNlOwoK
ICAgICAgICAvLyBDcmVhdGVzIGEgR2x5cGggcmVwcmVzZW50aW5nIGFuIGluZGl2aWR1YWwgVW5p
Y29kZSBjaGFyYWN0ZXIKICAgICAgICBwdWJsaWMgR2x5cGgoaW50IHVuaWNvZGVJRCwKICAgICAg
ICAgICAgICAgICAgICAgaW50IGdseXBoQ29kZSwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQg
YWR2YW5jZSwKICAgICAgICAgICAgICAgICAgICAgR2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUds
eXBoVmVjdG9yLAogICAgICAgICAgICAgICAgICAgICBHbHlwaFByb2R1Y2VyIHByb2R1Y2VyKSB7
CiAgICAgICAgICAgIHRoaXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAgICAgICAgICB0aGlz
LmdseXBoQ29kZSA9IGdseXBoQ29kZTsKICAgICAgICAgICAgdGhpcy5hZHZhbmNlID0gYWR2YW5j
ZTsKICAgICAgICAgICAgdGhpcy5zaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IgPSBzaW5nbGVVbmlj
b2RlR2x5cGhWZWN0b3I7CiAgICAgICAgICAgIHRoaXMucHJvZHVjZXIgPSBwcm9kdWNlcjsKICAg
ICAgICB9CgogICAgICAgIC8vIENyZWF0ZXMgYSBHbHlwaCByZXByZXNlbnRpbmcgYSBzZXF1ZW5j
ZSBvZiBjaGFyYWN0ZXJzLCB3aXRoCiAgICAgICAgLy8gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVy
IGFkZGl0aW9uYWwgc2luZ2xlIGdseXBocyBhcmUgYmVpbmcKICAgICAgICAvLyByZW5kZXJlZCBh
ZnRlciBpdAogICAgICAgIHB1YmxpYyBHbHlwaChTdHJpbmcgc3RyLCBib29sZWFuIG5lZWRBZHZh
bmNlKSB7CiAgICAgICAgICAgIHRoaXMuc3RyID0gc3RyOwogICAgICAgICAgICB0aGlzLm5lZWRB
ZHZhbmNlID0gbmVlZEFkdmFuY2U7CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGlz
IGdseXBoJ3MgdW5pY29kZSBJRCAqLwogICAgICAgIHB1YmxpYyBpbnQgZ2V0VW5pY29kZUlEKCkg
ewogICAgICAgICAgICByZXR1cm4gdW5pY29kZUlEOwogICAgICAgIH0KCiAgICAgICAgLyoqIFJl
dHVybnMgdGhpcyBnbHlwaCdzIChmb250LXNwZWNpZmljKSBnbHlwaCBjb2RlICovCiAgICAgICAg
cHVibGljIGludCBnZXRHbHlwaENvZGUoKSB7CiAgICAgICAgICAgIHJldHVybiBnbHlwaENvZGU7
CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGUgYWR2YW5jZSBmb3IgdGhpcyBnbHlw
aCAqLwogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRBZHZhbmNlKCkgewogICAgICAgICAgICByZXR1
cm4gYWR2YW5jZTsKICAgICAgICB9CgogICAgICAgIC8qKiBEcmF3cyB0aGlzIGdseXBoIGFuZCBy
ZXR1cm5zIHRoZSAoeCkgYWR2YW5jZSBmb3IgdGhpcyBnbHlwaCAqLwogICAgICAgIHB1YmxpYyBm
bG9hdCBkcmF3M0QoZmxvYXQgaW5YLCBmbG9hdCBpblksIGZsb2F0IHosIGZsb2F0IHNjYWxlRmFj
dG9yKSB7CiAgICAgICAgICAgIGlmIChzdHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgZHJh
dzNEX1JPQlVTVChzdHIsIGluWCwgaW5ZLCB6LCBzY2FsZUZhY3Rvcik7CiAgICAgICAgICAgICAg
ICBpZiAoIW5lZWRBZHZhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAg
ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGFk
dmFuY2UgZm9yIHRoaXMgc3RyaW5nCiAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBndiA9IGZv
bnQuY3JlYXRlR2x5cGhWZWN0b3IoZ2V0Rm9udFJlbmRlckNvbnRleHQoKSwgc3RyKTsKICAgICAg
ICAgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IGd2LmdldE51bUdseXBocygpOyBpKyspIHsKICAgICAgICAgICAgICAgICAg
ICB0b3RhbEFkdmFuY2UgKz0gZ3YuZ2V0R2x5cGhNZXRyaWNzKGkpLmdldEFkdmFuY2UoKTsKICAg
ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CiAgICAg
ICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNvZGUgcGF0aCB0YWtlbiBmb3Ig
aW5kaXZpZHVhbCBnbHlwaHMKICAgICAgICAgICAgaWYgKGdseXBoUmVjdEZvclRleHR1cmVNYXBw
aW5nID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHVwbG9hZCgpOwogICAgICAgICAgICB9Cgog
ICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKG1QaXBlbGluZWRRdWFkUmVuZGVy
ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIg
PSBuZXcgUGlwZWxpbmVkX1F1YWRSZW5kZXJlcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAg
ICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdTdG9yZSgpOwog
ICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBjYXNlIHdoZXJlIE5QT1QgdGV4dHVyZSBpcyB1c2Vk
IGZvciBiYWNraW5nIHN0b3JlCiAgICAgICAgICAgICAgICBUZXh0dXJlQ29vcmRzIHdob2xlSW1h
Z2VUZXhDb29yZHMgPSByZW5kZXJlci5nZXRUZXh0dXJlKCkuZ2V0SW1hZ2VUZXhDb29yZHMoKTsK
ICAgICAgICAgICAgICAgIGZsb2F0IHhTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMucmlnaHQo
KTsKICAgICAgICAgICAgICAgIGZsb2F0IHlTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMuYm90
dG9tKCk7CgogICAgICAgICAgICAgICAgUmVjdCByZWN0ID0gZ2x5cGhSZWN0Rm9yVGV4dHVyZU1h
cHBpbmc7CiAgICAgICAgICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRleHREYXRhKSByZWN0Lmdl
dFVzZXJEYXRhKCk7CiAgICAgICAgICAgICAgICBkYXRhLm1hcmtVc2VkKCk7CgogICAgICAgICAg
ICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QgPSBkYXRhLm9yaWdSZWN0KCk7CgogICAgICAgICAg
ICAgICAgZmxvYXQgeCA9IGluWCAtIChzY2FsZUZhY3RvciAqIGRhdGEub3JpZ09yaWdpblgoKSk7
CiAgICAgICAgICAgICAgICBmbG9hdCB5ID0gaW5ZIC0gKHNjYWxlRmFjdG9yICogKChmbG9hdCkg
b3JpZ1JlY3QuZ2V0SGVpZ2h0KCkgLSBkYXRhLm9yaWdPcmlnaW5ZKCkpKTsKCiAgICAgICAgICAg
ICAgICBpbnQgdGV4dHVyZXggPSByZWN0LngoKSArIChkYXRhLm9yaWdpbigpLnggLSBkYXRhLm9y
aWdPcmlnaW5YKCkpOwogICAgICAgICAgICAgICAgaW50IHRleHR1cmV5ID0gcmVuZGVyZXIuZ2V0
SGVpZ2h0KCkgLSByZWN0LnkoKSAtIChpbnQpIG9yaWdSZWN0LmdldEhlaWdodCgpIC0KICAgICAg
ICAgICAgICAgICAgICAoZGF0YS5vcmlnaW4oKS55IC0gZGF0YS5vcmlnT3JpZ2luWSgpKTsKICAg
ICAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIG9yaWdSZWN0LmdldFdpZHRoKCk7CiAgICAg
ICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCk7CgogICAg
ICAgICAgICAgICAgZmxvYXQgdHgxID0geFNjYWxlICogKGZsb2F0KSB0ZXh0dXJleCAvIChmbG9h
dCkgcmVuZGVyZXIuZ2V0V2lkdGgoKTsKICAgICAgICAgICAgICAgIGZsb2F0IHR5MSA9IHlTY2Fs
ZSAqICgxLjBmIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsb2F0
KSB0ZXh0dXJleSAvIChmbG9hdCkgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkpKTsKICAgICAgICAgICAg
ICAgIGZsb2F0IHR4MiA9IHhTY2FsZSAqIChmbG9hdCkgKHRleHR1cmV4ICsgd2lkdGgpIC8gKGZs
b2F0KSByZW5kZXJlci5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgZmxvYXQgdHkyID0geVNj
YWxlICogKDEuMGYgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxv
YXQpICh0ZXh0dXJleSArIGhlaWdodCkgLyAoZmxvYXQpIHJlbmRlcmVyLmdldEhlaWdodCgpKSk7
CgogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENvb3JkMmYodHgx
LCB0eTEpOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFZlcnRleDNm
KHgsIHksIHopOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENv
b3JkMmYodHgyLCB0eTEpOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5n
bFZlcnRleDNmKHggKyAod2lkdGggKiBzY2FsZUZhY3RvciksIHksCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeik7CiAgICAgICAgICAgICAgICBtUGlw
ZWxpbmVkUXVhZFJlbmRlcmVyLmdsVGV4Q29vcmQyZih0eDIsIHR5Mik7CiAgICAgICAgICAgICAg
ICBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyLmdsVmVydGV4M2YoeCArICh3aWR0aCAqIHNjYWxlRmFj
dG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5
ICsgKGhlaWdodCAqIHNjYWxlRmFjdG9yKSwgeik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVk
UXVhZFJlbmRlcmVyLmdsVGV4Q29vcmQyZih0eDEsIHR5Mik7CiAgICAgICAgICAgICAgICBtUGlw
ZWxpbmVkUXVhZFJlbmRlcmVyLmdsVmVydGV4M2YoeCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsgKGhlaWdodCAqIHNjYWxlRmFjdG9yKSwgeik7
CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBlLnBy
aW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhZHZhbmNl
OwogICAgICAgIH0KCiAgICAgICAgLyoqIE5vdGlmaWVzIHRoaXMgZ2x5cGggdGhhdCBpdCdzIGJl
ZW4gY2xlYXJlZCBvdXQgb2YgdGhlIGNhY2hlICovCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXIo
KSB7CiAgICAgICAgICAgIGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nID0gbnVsbDsKICAgICAg
ICB9CgogICAgICAgIHByaXZhdGUgdm9pZCB1cGxvYWQoKSB7CiAgICAgICAgICAgIEdseXBoVmVj
dG9yIGd2ID0gZ2V0R2x5cGhWZWN0b3IoKTsKICAgICAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ0JC
b3ggPSBwcmVOb3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKGd2LCBnZXRGb250UmVu
ZGVyQ29udGV4dCgpKSk7CiAgICAgICAgICAgIFJlY3RhbmdsZTJEIGJib3ggPSBub3JtYWxpemUo
b3JpZ0JCb3gpOwogICAgICAgICAgICBQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQoKGludCkgLWJi
b3guZ2V0TWluWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkg
LWJib3guZ2V0TWluWSgpKTsKICAgICAgICAgICAgUmVjdCByZWN0ID0gbmV3IFJlY3QoMCwgMCwg
KGludCkgYmJveC5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
aW50KSBiYm94LmdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
ZXcgVGV4dERhdGEobnVsbCwgb3JpZ2luLCBvcmlnQkJveCwgdW5pY29kZUlEKSk7CiAgICAgICAg
ICAgIHBhY2tlci5hZGQocmVjdCk7CiAgICAgICAgICAgIGdseXBoUmVjdEZvclRleHR1cmVNYXBw
aW5nID0gcmVjdDsKICAgICAgICAgICAgR3JhcGhpY3MyRCBnID0gZ2V0R3JhcGhpY3MyRCgpOwog
ICAgICAgICAgICAvLyBPSywgc2hvdWxkIG5vdyBoYXZlIGFuICh4LCB5KSBmb3IgdGhpcyByZWN0
YW5nbGU7IHJhc3Rlcml6ZQogICAgICAgICAgICAvLyB0aGUgZ2x5cGgKICAgICAgICAgICAgaW50
IHN0cnggPSByZWN0LngoKSArIG9yaWdpbi54OwogICAgICAgICAgICBpbnQgc3RyeSA9IHJlY3Qu
eSgpICsgb3JpZ2luLnk7CgogICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGFyZWEgd2UncmUg
Z29pbmcgdG8gZHJhdyBpbnRvCiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9z
aXRlLkNsZWFyKTsKICAgICAgICAgICAgZy5maWxsUmVjdChyZWN0LngoKSwgcmVjdC55KCksIHJl
Y3QudygpLCByZWN0LmgoKSk7CiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9z
aXRlLlNyYyk7CgogICAgICAgICAgICAvLyBEcmF3IHRoZSBzdHJpbmcKICAgICAgICAgICAgcmVu
ZGVyRGVsZWdhdGUuZHJhd0dseXBoVmVjdG9yKGcsIGd2LCBzdHJ4LCBzdHJ5KTsKCiAgICAgICAg
ICAgIGlmIChEUkFXX0JCT1hFUykgewogICAgICAgICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChU
ZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwogICAgICAgICAgICAgICAgLy8gRHJhdyBhIGJv
dW5kaW5nIGJveCBvbiB0aGUgYmFja2luZyBzdG9yZQogICAgICAgICAgICAgICAgZy5kcmF3UmVj
dChzdHJ4IC0gZGF0YS5vcmlnT3JpZ2luWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBz
dHJ5IC0gZGF0YS5vcmlnT3JpZ2luWSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50
KSBkYXRhLm9yaWdSZWN0KCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGludCkgZGF0YS5vcmlnUmVjdCgpLmdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgIGcuZHJh
d1JlY3Qoc3RyeCAtIGRhdGEub3JpZ2luKCkueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RyeSAtIGRhdGEub3JpZ2luKCkueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53
KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgLy8gTWFyayB0aGlzIHJlZ2lvbiBvZiB0aGUgVGV4dHVyZVJlbmRlcmVyIGFz
IGRpcnR5CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eShyZWN0LngoKSwg
cmVjdC55KCksIHJlY3QudygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmVjdC5oKCkpOwogICAgICAgICAgICAvLyBSZS1yZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCBv
dXIgcHJvZHVjZXIKICAgICAgICAgICAgcHJvZHVjZXIucmVnaXN0ZXIodGhpcyk7CiAgICAgICAg
fQoKICAgICAgICBwcml2YXRlIEdseXBoVmVjdG9yIGdldEdseXBoVmVjdG9yKCkgewogICAgICAg
ICAgICBHbHlwaFZlY3RvciBndiA9IHNpbmdsZVVuaWNvZGVHbHlwaFZlY3RvcjsKICAgICAgICAg
ICAgaWYgKGd2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHNpbmdsZVVuaWNvZGVHbHlwaFZl
Y3RvciA9IG51bGw7IC8vIERvbid0IG5lZWQgdGhpcyBhbnltb3JlCiAgICAgICAgICAgICAgICBy
ZXR1cm4gZ3Y7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IChj
aGFyKSB1bmljb2RlSUQ7CiAgICAgICAgICAgIHJldHVybiBmb250LmNyZWF0ZUdseXBoVmVjdG9y
KGdldEZvbnRSZW5kZXJDb250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgIH0KICAgIH0K
CiAgICBjbGFzcyBHbHlwaFByb2R1Y2VyIHsKICAgICAgICBmaW5hbCBpbnQgdW5kZWZpbmVkID0g
LTI7CiAgICAgICAgRm9udFJlbmRlckNvbnRleHQgZm9udFJlbmRlckNvbnRleHQ7CiAgICAgICAg
TGlzdC8qPEdseXBoPiovIGdseXBoc091dHB1dCA9IG5ldyBBcnJheUxpc3QvKjxHbHlwaD4qLygp
OwogICAgICAgIC8vIFRoZSBtYXBwaW5nIGZyb20gdW5pY29kZSBjaGFyYWN0ZXIgdG8gZm9udC1z
cGVjaWZpYyBnbHlwaCBJRAogICAgICAgIGludFtdIHVuaWNvZGVzMkdseXBoczsKICAgICAgICAv
LyBUaGUgbWFwcGluZyBmcm9tIGdseXBoIElEIHRvIEdseXBoCiAgICAgICAgR2x5cGhbXSBnbHlw
aENhY2hlOwogICAgICAgIC8vIFdlIHJlLXVzZSB0aGlzIGZvciBlYWNoIGluY29taW5nIHN0cmlu
ZwogICAgICAgIENoYXJTZXF1ZW5jZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQ2hhclNlcXVlbmNlSXRl
cmF0b3IoKTsKCiAgICAgICAgR2x5cGhQcm9kdWNlcihpbnQgZm9udExlbmd0aEluR2x5cGhzKSB7
CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBocyA9IG5ldyBpbnRbNTEyXTsKICAgICAgICAgICAg
Z2x5cGhDYWNoZSA9IG5ldyBHbHlwaFtmb250TGVuZ3RoSW5HbHlwaHNdOwogICAgICAgICAgICBj
bGVhckFsbENhY2hlRW50cmllcygpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExpc3QvKjxH
bHlwaD4qLyBnZXRHbHlwaHMoQ2hhclNlcXVlbmNlIGluU3RyaW5nKSB7CiAgICAgICAgICAgIGds
eXBoc091dHB1dC5jbGVhcigpOwogICAgICAgICAgICBpdGVyLmluaXRGcm9tQ2hhclNlcXVlbmNl
KGluU3RyaW5nKTsKICAgICAgICAgICAgR2x5cGhWZWN0b3IgZnVsbFJ1bkdseXBoVmVjdG9yID0g
Zm9udC5jcmVhdGVHbHlwaFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGl0ZXIpOwogICAgICAgICAgICBib29sZWFuIGNvbXBsZXggPSAoZnVsbFJ1bkdseXBoVmVjdG9y
LmdldExheW91dEZsYWdzKCkgIT0gMCk7CiAgICAgICAgICAgIGlmIChjb21wbGV4IHx8IERJU0FC
TEVfR0xZUEhfQ0FDSEUpIHsKICAgICAgICAgICAgICAgIC8vIFB1bnQgdG8gdGhlIHJvYnVzdCB2
ZXJzaW9uIG9mIHRoZSByZW5kZXJlcgogICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFkZChu
ZXcgR2x5cGgoaW5TdHJpbmcudG9TdHJpbmcoKSwgZmFsc2UpKTsKICAgICAgICAgICAgICAgIHJl
dHVybiBnbHlwaHNPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBsZW5ndGhJ
bkdseXBocyA9IGZ1bGxSdW5HbHlwaFZlY3Rvci5nZXROdW1HbHlwaHMoKTsKICAgICAgICAgICAg
aW50IGkgPSAwOwogICAgICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aEluR2x5cGhzKSB7CiAgICAg
ICAgICAgICAgICBHbHlwaCBnbHlwaCA9IGdldEdseXBoKGluU3RyaW5nLCBmdWxsUnVuR2x5cGhW
ZWN0b3IsIGkpOwogICAgICAgICAgICAgICAgaWYgKGdseXBoICE9IG51bGwpIHsKICAgICAgICAg
ICAgICAgICAgICBnbHlwaHNPdXRwdXQuYWRkKGdseXBoKTsKICAgICAgICAgICAgICAgICAgICBp
Kys7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEFzc2Vt
YmxlIGEgcnVuIG9mIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBmaXQgaW4KICAgICAgICAgICAgICAg
ICAgICAvLyB0aGUgY2FjaGUKICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0g
bmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3Ro
SW5HbHlwaHMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R2x5cGgoaW5TdHJpbmcs
IGZ1bGxSdW5HbHlwaFZlY3RvciwgaSkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAg
ICBidWYuYXBwZW5kKGluU3RyaW5nLmNoYXJBdChpKyspKTsKICAgICAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFkZChuZXcgR2x5cGgoYnVmLnRvU3Ry
aW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
QW55IG1vcmUgZ2x5cGhzIGFmdGVyIHRoaXMgcnVuPwogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGkgPCBsZW5ndGhJbkdseXBocykpOwogICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBnbHlwaHNPdXRwdXQ7CiAgICAg
ICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBjbGVhckNhY2hlRW50cnkoaW50IHVuaWNvZGVJRCkg
ewogICAgICAgICAgICBpbnQgZ2x5cGhJRCA9IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwog
ICAgICAgICAgICBpZiAoZ2x5cGhJRCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIEds
eXBoIGdseXBoID0gZ2x5cGhDYWNoZVtnbHlwaElEXTsKICAgICAgICAgICAgICAgIGlmIChnbHlw
aCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZ2x5cGguY2xlYXIoKTsKICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgICAgIGdseXBoQ2FjaGVbZ2x5cGhJRF0gPSBudWxsOwogICAg
ICAgICAgICB9CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdID0gdW5kZWZp
bmVkOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBbGxDYWNoZUVudHJpZXMo
KSB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pY29kZXMyR2x5cGhzLmxlbmd0
aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjbGVhckNhY2hlRW50cnkoaSk7CiAgICAgICAgICAg
IH0KICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEdseXBoIGdseXBoKSB7
CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1tnbHlwaC5nZXRVbmljb2RlSUQoKV0gPSBnbHlw
aC5nZXRHbHlwaENvZGUoKTsKICAgICAgICAgICAgZ2x5cGhDYWNoZVtnbHlwaC5nZXRHbHlwaENv
ZGUoKV0gPSBnbHlwaDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRHbHlwaFBp
eGVsV2lkdGgoY2hhciB1bmljb2RlSUQpIHsKICAgICAgICAgICAgR2x5cGggZ2x5cGggPSBnZXRH
bHlwaCh1bmljb2RlSUQpOwogICAgICAgICAgICBpZiAoZ2x5cGggIT0gbnVsbCkgewogICAgICAg
ICAgICAgICAgcmV0dXJuIGdseXBoLmdldEFkdmFuY2UoKTsKICAgICAgICAgICAgfQoKICAgICAg
ICAgICAgLy8gSGF2ZSB0byBkbyB0aGlzIHRoZSBoYXJkIC8gdW5jYWNoZWQgd2F5CiAgICAgICAg
ICAgIHNpbmdsZVVuaWNvZGVbMF0gPSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9y
IGd2ID0gZm9udC5jcmVhdGVHbHlwaFZlY3Rvcihmb250UmVuZGVyQ29udGV4dCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzaW5nbGVVbmljb2RlKTsKICAgICAgICAgICAgcmV0dXJuIGd2LmdldEdseXBoTWV0cmljcygw
KS5nZXRBZHZhbmNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm5zIGEgZ2x5cGggb2Jq
ZWN0IGZvciB0aGlzIHNpbmdsZSBnbHlwaC4gUmV0dXJucyBudWxsCiAgICAgICAgLy8gaWYgdGhl
IHVuaWNvZGUgb3IgZ2x5cGggSUQgd291bGQgYmUgb3V0IG9mIGJvdW5kcyBvZiB0aGUKICAgICAg
ICAvLyBnbHlwaCBjYWNoZS4KICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKENoYXJTZXF1
ZW5jZSBpblN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoVmVjdG9y
IGZ1bGxSdW5HbHlwaFZlY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBp
bmRleCkgewogICAgICAgICAgICBjaGFyIHVuaWNvZGVJRCA9IGluU3RyaW5nLmNoYXJBdChpbmRl
eCk7CgogICAgICAgICAgICBpZiAodW5pY29kZUlEID49IHVuaWNvZGVzMkdseXBocy5sZW5ndGgp
IHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAg
ICBpbnQgZ2x5cGhJRCA9IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwogICAgICAgICAgICBp
ZiAoZ2x5cGhJRCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnbHlwaENh
Y2hlW2dseXBoSURdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNdXN0IGZhYnJpY2F0
ZSB0aGUgZ2x5cGgKICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IHVuaWNvZGVJRDsKICAg
ICAgICAgICAgR2x5cGhWZWN0b3IgZ3YgPSBmb250LmNyZWF0ZUdseXBoVmVjdG9yKGdldEZvbnRS
ZW5kZXJDb250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgICAgICByZXR1cm4gZ2V0R2x5
cGgodW5pY29kZUlELCBndiwgZnVsbFJ1bkdseXBoVmVjdG9yLmdldEdseXBoTWV0cmljcyhpbmRl
eCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gSXQncyB1bmNsZWFyIHdoZXRoZXIgdGhpcyB2YXJp
YW50IG1pZ2h0IHByb2R1Y2UgbGVzcwogICAgICAgIC8vIG9wdGltYWwgcmVzdWx0cyB0aGFuIGlm
IHdlIGNhbiBzZWUgdGhlIGVudGlyZSBHbHlwaFZlY3RvcgogICAgICAgIC8vIGZvciB0aGUgaW5j
b21pbmcgc3RyaW5nCiAgICAgICAgcHJpdmF0ZSBHbHlwaCBnZXRHbHlwaChpbnQgdW5pY29kZUlE
KSB7CiAgICAgICAgICAgIGlmICh1bmljb2RlSUQgPj0gdW5pY29kZXMyR2x5cGhzLmxlbmd0aCkg
ewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAg
IGludCBnbHlwaElEID0gdW5pY29kZXMyR2x5cGhzW3VuaWNvZGVJRF07CiAgICAgICAgICAgIGlm
IChnbHlwaElEICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGdseXBoQ2Fj
aGVbZ2x5cGhJRF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9
IChjaGFyKSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZm9udC5jcmVh
dGVHbHlwaFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLCBzaW5nbGVVbmljb2RlKTsKICAg
ICAgICAgICAgcmV0dXJuIGdldEdseXBoKHVuaWNvZGVJRCwgZ3YsIGd2LmdldEdseXBoTWV0cmlj
cygwKSk7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKGludCB1bmlj
b2RlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBzaW5nbGVV
bmljb2RlR2x5cGhWZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaE1l
dHJpY3MgbWV0cmljcykgewogICAgICAgICAgICBpbnQgZ2x5cGhDb2RlID0gc2luZ2xlVW5pY29k
ZUdseXBoVmVjdG9yLmdldEdseXBoQ29kZSgwKTsKICAgICAgICAgICAgLy8gSGF2ZSBzZWVuIGh1
Z2UgZ2x5cGggY29kZXMgKDY1NTM2KSBjb21pbmcgb3V0IG9mIHNvbWUgZm9udHMgaW4gc29tZSBV
bmljb2RlIHNpdHVhdGlvbnMKICAgICAgICAgICAgaWYgKGdseXBoQ29kZSA+PSBnbHlwaENhY2hl
Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAg
ICAgICAgICAgR2x5cGggZ2x5cGggPSBuZXcgR2x5cGgodW5pY29kZUlELAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBnbHlwaENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1ldHJpY3MuZ2V0QWR2YW5jZSgpLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHRoaXMpOwogICAgICAgICAgICByZWdpc3RlcihnbHlwaCk7CiAg
ICAgICAgICAgIHJldHVybiBnbHlwaDsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgUGlwZWxp
bmVkX1F1YWRSZW5kZXJlciB7CiAgICAgICAgaW50IG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2Vz
UGlwZWxpbmUgPSAwOwogICAgICAgIEZsb2F0QnVmZmVyIG1UZXhDb29yZHM7CiAgICAgICAgRmxv
YXRCdWZmZXIgbVZlcnRDb29yZHM7CiAgICAgICAgYm9vbGVhbiB1c2luZ1ZCT3M7CiAgICAgICAg
aW50IG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2VzOwogICAgICAgIGludCBtVkJPX0Zvcl9S
ZXN1YWJsZVRpbGVUZXhDb29yZHM7CgogICAgICAgIFBpcGVsaW5lZF9RdWFkUmVuZGVyZXIoKSB7
CiAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwogICAgICAgICAgICBtVmVy
dENvb3JkcyA9IEJ1ZmZlclV0aWwubmV3RmxvYXRCdWZmZXIoa1RvdGFsQnVmZmVyU2l6ZUNvb3Jk
c1ZlcnRzKTsKICAgICAgICAgICAgbVRleENvb3JkcyA9IEJ1ZmZlclV0aWwubmV3RmxvYXRCdWZm
ZXIoa1RvdGFsQnVmZmVyU2l6ZUNvb3Jkc1RleCk7CgogICAgICAgICAgICB1c2luZ1ZCT3MgPSBp
c1ZCT0F2YWlsYWJsZShnbCk7CgogICAgICAgICAgICBpZiAodXNpbmdWQk9zKSB7CiAgICAgICAg
ICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGludFtdIHZib3MgPSBuZXcgaW50WzJd
OwogICAgICAgICAgICAgICAgICAgIGdsLmdsR2VuQnVmZmVycygyLCBJbnRCdWZmZXIud3JhcCh2
Ym9zKSk7CgogICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2Vz
ID0gdmJvc1swXTsKICAgICAgICAgICAgICAgICAgICBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVUZXhD
b29yZHMgPSB2Ym9zWzFdOwoKICAgICAgICAgICAgICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wu
R0xfQVJSQVlfQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVkJP
X0Zvcl9SZXN1YWJsZVRpbGVWZXJ0aWNlcyk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCdWZm
ZXJEYXRhKEdMLkdMX0FSUkFZX0JVRkZFUiwga1RvdGFsQnVmZmVyU2l6ZUJ5dGVzVmVydHMsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEdMLkdMX1NUUkVBTV9EUkFX
KTsgLy8gc3RyZWFtIGRyYXcgYmVjYXVzZSB0aGlzIGlzIGEgc2luZ2xlIHF1YWQgdXNlIHBpcGVs
aW5lCgogICAgICAgICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJBWV9CVUZG
RVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxl
VGlsZVRleENvb3Jkcyk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCdWZmZXJEYXRhKEdMLkdM
X0FSUkFZX0JVRkZFUiwga1RvdGFsQnVmZmVyU2l6ZUJ5dGVzVGV4LAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBudWxsLCBHTC5HTF9TVFJFQU1fRFJBVyk7IC8vIHN0cmVhbSBk
cmF3IGJlY2F1c2UgdGhpcyBpcyBhIHNpbmdsZSBxdWFkIHVzZSBwaXBlbGluZQogICAgICAgICAg
ICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICBpc0V4dGVu
c2lvbkF2YWlsYWJsZV9WQk8gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB1c2luZ1ZCT3Mg
PSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAg
ICAgcHVibGljIHZvaWQgZ2xUZXhDb29yZDJmKGZsb2F0IHYsIGZsb2F0IHYxKSB7CiAgICAgICAg
ICAgIG1UZXhDb29yZHMucHV0KHYpOwogICAgICAgICAgICBtVGV4Q29vcmRzLnB1dCh2MSk7CiAg
ICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBnbFZlcnRleDNmKGZsb2F0IGluWCwgZmxvYXQg
aW5ZLCBmbG9hdCBpblopIHsKICAgICAgICAgICAgbVZlcnRDb29yZHMucHV0KGluWCk7CiAgICAg
ICAgICAgIG1WZXJ0Q29vcmRzLnB1dChpblkpOwogICAgICAgICAgICBtVmVydENvb3Jkcy5wdXQo
aW5aKTsKCiAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUrKzsK
CiAgICAgICAgICAgIGlmIChtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lID49IGtU
b3RhbEJ1ZmZlclNpemVWZXJ0cykgewogICAgICAgICAgICAgICAgdGhpcy5kcmF3KCk7CiAgICAg
ICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCBkcmF3KCkgewogICAgICAg
ICAgICBpZiAodXNlVmVydGV4QXJyYXlzKSB7CiAgICAgICAgICAgICAgICBkcmF3VmVydGV4QXJy
YXlzKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkcmF3SU1NRURJQVRF
KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCBkcmF3VmVy
dGV4QXJyYXlzKCkgewogICAgICAgICAgICBpZiAobU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQ
aXBlbGluZSA+IDApIHsKICAgICAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgp
OwoKICAgICAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdT
dG9yZSgpOwogICAgICAgICAgICAgICAgVGV4dHVyZSB0ZXh0dXJlID0gcmVuZGVyZXIuZ2V0VGV4
dHVyZSgpOyAvLyB0cmlnZ2VycyB0ZXh0dXJlIHVwbG9hZHMuICBNYXliZSB0aGlzIHNob3VsZCBi
ZSBtb3JlIG9idmlvdXM/CgogICAgICAgICAgICAgICAgbVZlcnRDb29yZHMucmV3aW5kKCk7CiAg
ICAgICAgICAgICAgICBtVGV4Q29vcmRzLnJld2luZCgpOwoKICAgICAgICAgICAgICAgIGdsLmds
RW5hYmxlQ2xpZW50U3RhdGUoR0wuR0xfVkVSVEVYX0FSUkFZKTsKCiAgICAgICAgICAgICAgICBp
ZiAodXNpbmdWQk9zKSB7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdM
X0FSUkFZX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZCT19G
b3JfUmVzdWFibGVUaWxlVmVydGljZXMpOwogICAgICAgICAgICAgICAgICAgIGdsLmdsQnVmZmVy
U3ViRGF0YShHTC5HTF9BUlJBWV9CVUZGRVIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgKiBrU2l6ZUlu
Qnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbVZlcnRDb29yZHMpOyAvLyB1cGxvYWQgb25seSB0aGUgbmV3IHN0dWZmCiAg
ICAgICAgICAgICAgICAgICAgZ2wuZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMLkdMX0ZMT0FULCAwLCAw
KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
ICAgICAgICAgIGdsLmdsVmVydGV4UG9pbnRlcigzLCBHTC5HTF9GTE9BVCwgMCwgbVZlcnRDb29y
ZHMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50
U3RhdGUoR0wuR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7CgogICAgICAgICAgICAgICAgaWYgKHVz
aW5nVkJPcykgewogICAgICAgICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJB
WV9CVUZGRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jl
c3VhYmxlVGlsZVRleENvb3Jkcyk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCdWZmZXJTdWJE
YXRhKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSAqIGtTaXplSW5CeXRl
c19PbmVWZXJ0aWNlc19UZXhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtVGV4Q29vcmRzKTsgLy8gdXBsb2FkIG9ubHkgdGhlIG5ldyBzdHVmZgogICAgICAgICAg
ICAgICAgICAgIGdsLmdsVGV4Q29vcmRQb2ludGVyKDIsIEdMLkdMX0ZMT0FULCAwLCAwKTsKICAg
ICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZFBv
aW50ZXIoMiwgR0wuR0xfRkxPQVQsIDAsIG1UZXhDb29yZHMpOwogICAgICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgICAgIGdsLmdsRHJhd0FycmF5cyhHTC5HTF9RVUFEUywgMCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5l
KTsKCiAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5yZXdpbmQoKTsKICAgICAgICAgICAgICAg
IG1UZXhDb29yZHMucmV3aW5kKCk7CiAgICAgICAgICAgICAgICBtT3V0c3RhbmRpbmdHbHlwaHNW
ZXJ0aWNlc1BpcGVsaW5lID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHJp
dmF0ZSB2b2lkIGRyYXdJTU1FRElBVEUoKSB7CiAgICAgICAgICAgIGlmIChtT3V0c3RhbmRpbmdH
bHlwaHNWZXJ0aWNlc1BpcGVsaW5lID4gMCkgewogICAgICAgICAgICAgICAgVGV4dHVyZVJlbmRl
cmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CiAgICAgICAgICAgICAgICBUZXh0dXJl
IHRleHR1cmUgPSByZW5kZXJlci5nZXRUZXh0dXJlKCk7IC8vIHRyaWdnZXJzIHRleHR1cmUgdXBs
b2Fkcy4gIE1heWJlIHRoaXMgc2hvdWxkIGJlIG1vcmUgb2J2aW91cz8KCiAgICAgICAgICAgICAg
ICBHTCBnbCA9IEdMVS5nZXRDdXJyZW50R0woKTsKICAgICAgICAgICAgICAgIGdsLmdsQmVnaW4o
R0wuR0xfUVVBRFMpOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAg
aW50IG51bWJlck9mUXVhZHMgPSBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lIC8g
NDsKICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5yZXdpbmQoKTsKICAgICAgICAgICAg
ICAgICAgICBtVGV4Q29vcmRzLnJld2luZCgpOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IG51bWJlck9mUXVhZHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAg
ICBnbC5nbFRleENvb3JkMmYobVRleENvb3Jkcy5nZXQoKSwgbVRleENvb3Jkcy5nZXQoKSk7CiAg
ICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4M2YobVZlcnRDb29yZHMuZ2V0KCksIG1W
ZXJ0Q29vcmRzLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1W
ZXJ0Q29vcmRzLmdldCgpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4Q29vcmQy
ZihtVGV4Q29vcmRzLmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsKICAgICAgICAgICAgICAgICAg
ICAgICAgZ2wuZ2xWZXJ0ZXgzZihtVmVydENvb3Jkcy5nZXQoKSwgbVZlcnRDb29yZHMuZ2V0KCks
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlcnRDb29yZHMuZ2V0KCkp
OwoKICAgICAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZDJmKG1UZXhDb29yZHMuZ2V0
KCksIG1UZXhDb29yZHMuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBnbC5nbFZlcnRl
eDNmKG1WZXJ0Q29vcmRzLmdldCgpLCBtVmVydENvb3Jkcy5nZXQoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQoKSk7CgogICAgICAgICAgICAg
ICAgICAgICAgICBnbC5nbFRleENvb3JkMmYobVRleENvb3Jkcy5nZXQoKSwgbVRleENvb3Jkcy5n
ZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4M2YobVZlcnRDb29yZHMu
Z2V0KCksIG1WZXJ0Q29vcmRzLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1WZXJ0Q29vcmRzLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg
ICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJp
bnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAg
ICAgICAgIGdsLmdsRW5kKCk7CiAgICAgICAgICAgICAgICAgICAgbVZlcnRDb29yZHMucmV3aW5k
KCk7CiAgICAgICAgICAgICAgICAgICAgbVRleENvb3Jkcy5yZXdpbmQoKTsKICAgICAgICAgICAg
ICAgICAgICBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lID0gMDsKICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBEZWJ1Z0xp
c3RlbmVyIGltcGxlbWVudHMgR0xFdmVudExpc3RlbmVyIHsKICAgICAgICBwcml2YXRlIEdMVSBn
bHUgPSBuZXcgR0xVKCk7CiAgICAgICAgcHJpdmF0ZSBGcmFtZSBmcmFtZTsKCiAgICAgICAgRGVi
dWdMaXN0ZW5lcihGcmFtZSBmcmFtZSkgewogICAgICAgICAgICB0aGlzLmZyYW1lID0gZnJhbWU7
CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBkaXNwbGF5KEdMQXV0b0RyYXdhYmxlIGRy
YXdhYmxlKSB7CiAgICAgICAgICAgIEdMIGdsID0gZHJhd2FibGUuZ2V0R0woKTsKICAgICAgICAg
ICAgZ2wuZ2xDbGVhcihHTC5HTF9ERVBUSF9CVUZGRVJfQklUIHwgR0wuR0xfQ09MT1JfQlVGRkVS
X0JJVCk7CgogICAgICAgICAgICBpZiAocGFja2VyID09IG51bGwpIHsKICAgICAgICAgICAgICAg
IHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmQg
PSBnZXRCYWNraW5nU3RvcmUoKTsKICAgICAgICAgICAgZmluYWwgaW50IHcgPSByZW5kLmdldFdp
ZHRoKCk7CiAgICAgICAgICAgIGZpbmFsIGludCBoID0gcmVuZC5nZXRIZWlnaHQoKTsKICAgICAg
ICAgICAgcmVuZC5iZWdpbk9ydGhvUmVuZGVyaW5nKHcsIGgpOwogICAgICAgICAgICByZW5kLmRy
YXdPcnRob1JlY3QoMCwgMCk7CiAgICAgICAgICAgIHJlbmQuZW5kT3J0aG9SZW5kZXJpbmcoKTsK
CiAgICAgICAgICAgIGlmICgoZnJhbWUuZ2V0V2lkdGgoKSAhPSB3KSB8fCAoZnJhbWUuZ2V0SGVp
Z2h0KCkgIT0gaCkpIHsKICAgICAgICAgICAgICAgIEV2ZW50UXVldWUuaW52b2tlTGF0ZXIobmV3
IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5zZXRTaXplKHcsIGgpOwogICAgICAg
ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0K
ICAgICAgICB9CgogICAgICAgIC8vIFVudXNlZCBtZXRob2RzCiAgICAgICAgcHVibGljIHZvaWQg
aW5pdChHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSkgewogICAgICAgIH0KCiAgICAgICAgcHVibGlj
IHZvaWQgcmVzaGFwZShHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSwgaW50IHgsIGludCB5LCBpbnQg
d2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CiAgICAgICAg
fQoKICAgICAgICBwdWJsaWMgdm9pZCBkaXNwbGF5Q2hhbmdlZChHTEF1dG9EcmF3YWJsZSBkcmF3
YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1vZGVDaGFu
Z2VkLCBib29sZWFuIGRldmljZUNoYW5nZWQpIHsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAg
ICAgKiBTZXRzIHdoZXRoZXIgdmVydGV4IGFycmF5cyBhcmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5
IGZvcgogICAgICogcmVuZGVyaW5nLCBvciB3aGV0aGVyIHRleHQgaXMgcmVuZGVyZWQgdXNpbmcg
dGhlIE9wZW5HTAogICAgICogaW1tZWRpYXRlIG1vZGUgY29tbWFuZHMuIFRoaXMgaXMgcHJvdmlk
ZWQgYXMgYSBjb25jZXNzaW9uIGZvcgogICAgICogY2VydGFpbiBncmFwaGljcyBjYXJkcyB3aGlj
aCBoYXZlIHBvb3IgdmVydGV4IGFycmF5CiAgICAgKiBwZXJmb3JtYW5jZS4gRGVmYXVsdHMgdG8g
dHJ1ZS4KICAgICAqLwogICAgcHVibGljIHZvaWQgc2V0VXNlVmVydGV4QXJyYXlzKGJvb2xlYW4g
dXNlVmVydGV4QXJyYXlzKSB7CiAgICAgICAgdGhpcy51c2VWZXJ0ZXhBcnJheXMgPSB1c2VWZXJ0
ZXhBcnJheXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB2ZXJ0ZXgg
YXJyYXlzIGFyZSBiZWluZyB1c2VkIGludGVybmFsbHkgZm9yCiAgICAgKiByZW5kZXJpbmcsIG9y
IHdoZXRoZXIgdGV4dCBpcyByZW5kZXJlZCB1c2luZyB0aGUgT3BlbkdMCiAgICAgKiBpbW1lZGlh
dGUgbW9kZSBjb21tYW5kcy4gRGVmYXVsdHMgdG8gdHJ1ZS4KICAgICAqLwogICAgcHVibGljIGJv
b2xlYW4gZ2V0VXNlVmVydGV4QXJyYXlzKCkgewogICAgICAgIHJldHVybiB1c2VWZXJ0ZXhBcnJh
eXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHdoZXRoZXIgc21vb3RoaW5nIChpLmUuLCBH
TF9MSU5FQVIgZmlsdGVyaW5nKSBpcyBlbmFibGVkCiAgICAgKiBpbiB0aGUgYmFja2luZyBUZXh0
dXJlUmVuZGVyZXIgb2YgdGhpcyBUZXh0UmVuZGVyZXIuIEEgZmV3CiAgICAgKiBncmFwaGljcyBj
YXJkcyBkbyBub3QgYmVoYXZlIHdlbGwgd2hlbiB0aGlzIGlzIGVuYWJsZWQsCiAgICAgKiByZXN1
bHRpbmcgaW4gZnV6enkgdGV4dC4gRGVmYXVsdHMgdG8gdHJ1ZS4KICAgICAqLwogICAgcHVibGlj
IHZvaWQgc2V0U21vb3RoaW5nKGJvb2xlYW4gc21vb3RoaW5nKSB7CiAgICAgICAgdGhpcy5zbW9v
dGhpbmcgPSBzbW9vdGhpbmc7CiAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuc2V0U21vb3RoaW5n
KHNtb290aGluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBzbW9v
dGhpbmcgaXMgZW5hYmxlZCBpbiB0aGUgYmFja2luZwogICAgICogVGV4dHVyZVJlbmRlcmVyIG9m
IHRoaXMgVGV4dFJlbmRlcmVyLiBBIGZldyBncmFwaGljcyBjYXJkcyBkbwogICAgICogbm90IGJl
aGF2ZSB3ZWxsIHdoZW4gdGhpcyBpcyBlbmFibGVkLCByZXN1bHRpbmcgaW4gZnV6enkgdGV4dC4K
ICAgICAqIERlZmF1bHRzIHRvIHRydWUuCiAgICAgKi8KICAgIHB1YmxpYyBib29sZWFuIGdldFNt
b290aGluZygpIHsKICAgICAgICByZXR1cm4gc21vb3RoaW5nOwogICAgfQoKICAgIHByaXZhdGUg
Ym9vbGVhbiBpc1ZCT0F2YWlsYWJsZShHTCBnbCkgewogICAgICAgIGlmICghY2hlY2tGb3JfaXNF
eHRlbnNpb25BdmFpbGFibGVfVkJPKSB7CiAgICAgICAgICAgIGlzRXh0ZW5zaW9uQXZhaWxhYmxl
X1ZCTyA9IGdsLmlzRXh0ZW5zaW9uQXZhaWxhYmxlKCJHTF9WRVJTSU9OXzFfNSIpOwogICAgICAg
IC8qKgogICAgICAgICAqIEdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdCBpcyBhdmFpbGFibGUg
aW4gT3BlbkdMIDEuNCBhbmQgc29tZXRpbWVzCiAgICAgICAgICogaW4gT3BlbkdMIDEuMy4gTWl4
aW5nIHZlcnRleCBhcnJheXMgYW5kIFZCTyBjYW4gY2F1c2Ugc29tZSBwcm9ibGVtcyAKICAgICAg
ICAgKiB3aGVuIGNhbGxpbmcgZ2xWZXJ0ZXhQb2ludGVyIGZyb20gdGhlIFRleHRSZW5kZXJlciB3
aGVyZWFzIAogICAgICAgICAqIGdsQmluZEJ1ZmZlckFSQiB3YXMgY2FsbGVkIGJlZm9yZSBpbiBv
cmRlciB0byBiaW5kIGEgVkJPIGJlY2F1c2Ugbm8gVkJPIAogICAgICAgICAqIG11c3QgYmUgYWxy
ZWFkeSBib3VuZCB3aGVuIGNhbGxpbmcgZ2xWZXJ0ZXhQb2ludGVyIHdpdGggYSBOSU8gCiAgICAg
ICAgICogYnVmZmVyIGFzIGxhc3QgYXJndW1lbnQuCiAgICAgICAgICogV2UgY2Fubm90IGFzayB0
aGUgcHJvZ3JhbW1lcnMgdG8gZXhwbGljaXRseSB1bmJpbmQgdGhlaXIgVkJPcwogICAgICAgICAq
IHRvIGF2b2lkIHRoaXMgcHJvYmxlbSBiZWNhdXNlIGl0IGhhcyBhbiBpbXBvcnRhbnQgY29zdCAK
ICAgICAgICAgKiBlc3BlY2lhbGx5IGZvciBzdGF0aWMgVkJPcy4KICAgICAgICAgKi8KICAgICAg
ICBpZiAoIWlzRXh0ZW5zaW9uQXZhaWxhYmxlX1ZCTykgewogICAgICAgICAgICBpZiAoZ2wuaXNF
eHRlbnNpb25BdmFpbGFibGUoIkdMX1ZFUlNJT05fMV80IikgfHwgZ2wuaXNFeHRlbnNpb25BdmFp
bGFibGUoIkdMX1ZFUlNJT05fMV8zIikpIHsKICAgICAgICAgICAgaWYgKGdsLmlzRXh0ZW5zaW9u
QXZhaWxhYmxlKCJHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QiKSAKICAgICAgICAgICAgICAg
ICYmIGdsLmlzRnVuY3Rpb25BdmFpbGFibGUoImdsQmluZEJ1ZmZlckFSQiIpCiAgICAgICAgICAg
ICAgICAmJiBnbC5pc0Z1bmN0aW9uQXZhaWxhYmxlKCJnbEJ1ZmZlckRhdGFBUkIiKQogICAgICAg
ICAgICAgICAgJiYgZ2wuaXNGdW5jdGlvbkF2YWlsYWJsZSgiZ2xHZW5CdWZmZXJzQVJCIikKICAg
ICAgICAgICAgICAgICYmIGdsLmlzRnVuY3Rpb25BdmFpbGFibGUoImdsQnVmZmVyU3ViRGF0YUFS
QiIpKSB7CiAgICAgICAgICAgICAgICBzZXRVc2VWZXJ0ZXhBcnJheXMoZmFsc2UpOwogICAgICAg
ICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAgIGNoZWNrRm9yX2lzRXh0
ZW5zaW9uQXZhaWxhYmxlX1ZCTyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpc0V4
dGVuc2lvbkF2YWlsYWJsZV9WQk87CiAgICB9Cn0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>132</attachid>
            <date>2008-08-19 13:44:00 +0200</date>
            <delta_ts>2008-08-19 13:44:00 +0200</delta_ts>
            <desc>Final cleanest fix, tested under OpenGL 1.3</desc>
            <filename>TextRenderer.java</filename>
            <type>text/plain</type>
            <size>78739</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChjKSAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKICogbWV0OgogKgog
KiAtIFJlZGlzdHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIC0gUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgogKgogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIElu
Yy4gb3IgdGhlIG5hbWVzIG9mCiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRoaXMgc29mdHdhcmUg
aXMgcHJvdmlkZWQgIkFTIElTLCIgd2l0aG91dCBhIHdhcnJhbnR5IG9mIGFueSBraW5kLiBBTEwK
ICogRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FS
UkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJ
TElUWSwgRklUTkVTUyBGT1IgQQogKiBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdF
TUVOVCwgQVJFIEhFUkVCWSBFWENMVURFRC4gU1VOCiAqIE1JQ1JPU1lTVEVNUywgSU5DLiAoIlNV
TiIpIEFORCBJVFMgTElDRU5TT1JTIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SCiAqIEFOWSBEQU1B
R0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIFVTSU5HLCBNT0RJRllJTkcg
T1IKICogRElTVFJJQlVUSU5HIFRISVMgU09GVFdBUkUgT1IgSVRTIERFUklWQVRJVkVTLiBJTiBO
TyBFVkVOVCBXSUxMIFNVTiBPUgogKiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIExP
U1QgUkVWRU5VRSwgUFJPRklUIE9SIERBVEEsIE9SIEZPUgogKiBESVJFQ1QsIElORElSRUNULCBT
UEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SIFBVTklUSVZFCiAqIERBTUFHRVMs
IEhPV0VWRVIgQ0FVU0VEIEFORCBSRUdBUkRMRVNTIE9GIFRIRSBUSEVPUlkgT0YgTElBQklMSVRZ
LAogKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRgogKiBTVU4gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0VTLgogKgogKiBZb3UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIHNvZnR3
YXJlIGlzIG5vdCBkZXNpZ25lZCBvciBpbnRlbmRlZCBmb3IgdXNlCiAqIGluIHRoZSBkZXNpZ24s
IGNvbnN0cnVjdGlvbiwgb3BlcmF0aW9uIG9yIG1haW50ZW5hbmNlIG9mIGFueSBudWNsZWFyCiAq
IGZhY2lsaXR5LgogKgogKiBTdW4gZ3JhdGVmdWxseSBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIHNv
ZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGF1dGhvcmVkCiAqIGFuZCBkZXZlbG9wZWQgYnkgS2VubmV0
aCBCcmFkbGV5IFJ1c3NlbGwgYW5kIENocmlzdG9waGVyIEpvaG4gS2xpbmUuCiAqLwpwYWNrYWdl
IGNvbS5zdW4ub3BlbmdsLnV0aWwuajJkOwoKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwuKjsK
aW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwucGFja3JlY3QuKjsKaW1wb3J0IGNvbS5zdW4ub3Bl
bmdsLnV0aWwuKjsKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLnV0aWwudGV4dHVyZS4qOwoKaW1wb3J0
IGphdmEuYXd0LkFscGhhQ29tcG9zaXRlOwppbXBvcnQgamF2YS5hd3QuQ29sb3I7CmltcG9ydCBq
YXZhLmF3dC5Db21wb3NpdGU7CgovLyBGb3IgZGVidWdnaW5nIHB1cnBvc2VzCmltcG9ydCBqYXZh
LmF3dC5FdmVudFF1ZXVlOwppbXBvcnQgamF2YS5hd3QuRm9udDsKaW1wb3J0IGphdmEuYXd0LkZy
YW1lOwppbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKaW1wb3J0IGphdmEuYXd0LkltYWdlOwpp
bXBvcnQgamF2YS5hd3QuUG9pbnQ7CmltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKaW1w
b3J0IGphdmEuYXd0LmV2ZW50Lio7CmltcG9ydCBqYXZhLmF3dC5mb250Lio7CmltcG9ydCBqYXZh
LmF3dC5nZW9tLio7CgppbXBvcnQgamF2YS5uaW8uKjsKCmltcG9ydCBqYXZhLnRleHQuKjsKCmlt
cG9ydCBqYXZhLnV0aWwuKjsKCmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuKjsKaW1wb3J0IGph
dmF4Lm1lZGlhLm9wZW5nbC5nbHUuKjsKCgovKiogUmVuZGVycyBiaXRtYXBwZWQgSmF2YSAyRCB0
ZXh0IGludG8gYW4gT3BlbkdMIHdpbmRvdyB3aXRoIGhpZ2gKICAgIHBlcmZvcm1hbmNlLCBmdWxs
IFVuaWNvZGUgc3VwcG9ydCwgYW5kIGEgc2ltcGxlIEFQSS4gUGVyZm9ybXMKICAgIGFwcHJvcHJp
YXRlIGNhY2hpbmcgb2YgdGV4dCByZW5kZXJpbmcgcmVzdWx0cyBpbiBhbiBPcGVuR0wgdGV4dHVy
ZQogICAgaW50ZXJuYWxseSB0byBhdm9pZCByZXBlYXRlZCBmb250IHJhc3Rlcml6YXRpb24uIFRo
ZSBjYWNoaW5nIGlzCiAgICBjb21wbGV0ZWx5IGF1dG9tYXRpYywgZG9lcyBub3QgcmVxdWlyZSBh
bnkgdXNlciBpbnRlcnZlbnRpb24sIGFuZAogICAgaGFzIG5vIHZpc2libGUgY29udHJvbHMgaW4g
dGhlIHB1YmxpYyBBUEkuIDxQPgoKICAgIFVzaW5nIHRoZSB7QGxpbmsgVGV4dFJlbmRlcmVyIFRl
eHRSZW5kZXJlcn0gaXMgc2ltcGxlLiBBZGQgYQogICAgIjxjb2RlPlRleHRSZW5kZXJlciByZW5k
ZXJlcjs8L2NvZGU+IiBmaWVsZCB0byB5b3VyIHtAbGluawogICAgamF2YXgubWVkaWEub3Blbmds
LkdMRXZlbnRMaXN0ZW5lciBHTEV2ZW50TGlzdGVuZXJ9LiBJbiB5b3VyIHtAbGluawogICAgamF2
YXgubWVkaWEub3BlbmdsLkdMRXZlbnRMaXN0ZW5lciNpbml0IGluaXR9IG1ldGhvZCwgYWRkOgoK
ICAgIDxQUkU+CiAgICByZW5kZXJlciA9IG5ldyBUZXh0UmVuZGVyZXIobmV3IEZvbnQoIlNhbnNT
ZXJpZiIsIEZvbnQuQk9MRCwgMzYpKTsKICAgIDwvUFJFPgoKICAgIDxQPiBJbiB0aGUge0BsaW5r
IGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIjZGlzcGxheSBkaXNwbGF5fSBtZXRo
b2Qgb2YgeW91cgogICAge0BsaW5rIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIg
R0xFdmVudExpc3RlbmVyfSwgYWRkOgogICAgPFBSRT4KICAgIHJlbmRlcmVyLmJlZ2luUmVuZGVy
aW5nKGRyYXdhYmxlLmdldFdpZHRoKCksIGRyYXdhYmxlLmdldEhlaWdodCgpKTsKICAgIC8vIG9w
dGlvbmFsbHkgc2V0IHRoZSBjb2xvcgogICAgcmVuZGVyZXIuc2V0Q29sb3IoMS4wZiwgMC4yZiwg
MC4yZiwgMC44Zik7CiAgICByZW5kZXJlci5kcmF3KCJUZXh0IHRvIGRyYXciLCB4UG9zaXRpb24s
IHlQb3NpdGlvbik7CiAgICAvLyAuLi4gbW9yZSBkcmF3IGNvbW1hbmRzLCBjb2xvciBjaGFuZ2Vz
LCBldGMuCiAgICByZW5kZXJlci5lbmRSZW5kZXJpbmcoKTsKICAgIDwvUFJFPgoKICAgIFVubGVz
cyB5b3UgYXJlIHNoYXJpbmcgdGV4dHVyZXMgYW5kIGRpc3BsYXkgbGlzdHMgYmV0d2VlbiBPcGVu
R0wKICAgIGNvbnRleHRzLCB5b3UgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGUge0BsaW5rICNkaXNw
b3NlIGRpc3Bvc2V9CiAgICBtZXRob2Qgb2YgdGhlIFRleHRSZW5kZXJlcjsgdGhlIE9wZW5HTCBy
ZXNvdXJjZXMgaXQgdXNlcwogICAgaW50ZXJuYWxseSB3aWxsIGJlIGNsZWFuZWQgdXAgYXV0b21h
dGljYWxseSB3aGVuIHRoZSBPcGVuR0wKICAgIGNvbnRleHQgaXMgZGVzdHJveWVkLiA8UD4KCiAg
ICA8Yj5Ob3RlPC9iPiB0aGF0IHRoZSBUZXh0UmVuZGVyZXIgbWF5IGNhdXNlIHRoZSB2ZXJ0ZXgg
YW5kIHRleHR1cmUKICAgIGNvb3JkaW5hdGUgYXJyYXkgYnVmZmVyIGJpbmRpbmdzIHRvIGNoYW5n
ZSwgb3IgdG8gYmUgdW5ib3VuZC4gVGhpcwogICAgaXMgaW1wb3J0YW50IHRvIG5vdGUgaWYgeW91
IGFyZSB1c2luZyBWZXJ0ZXggQnVmZmVyIE9iamVjdHMgKFZCT3MpCiAgICBpbiB5b3VyIGFwcGxp
Y2F0aW9uLiA8UD4KCiAgICBJbnRlcm5hbGx5LCB0aGUgcmVuZGVyZXIgdXNlcyBhIHJlY3Rhbmds
ZSBwYWNraW5nIGFsZ29yaXRobSB0bwogICAgcGFjayBib3RoIGdseXBocyBhbmQgZnVsbCBTdHJp
bmdzJyByZW5kZXJpbmcgcmVzdWx0cyAod2hpY2ggYXJlCiAgICB2YXJpYWJsZSBzaXplKSBvbnRv
IGEgbGFyZ2VyIE9wZW5HTCB0ZXh0dXJlLiBUaGUgaW50ZXJuYWwgYmFja2luZwogICAgc3RvcmUg
aXMgbWFpbnRhaW5lZCB1c2luZyBhIHtAbGluawogICAgY29tLnN1bi5vcGVuZ2wudXRpbC5qMmQu
VGV4dHVyZVJlbmRlcmVyIFRleHR1cmVSZW5kZXJlcn0uIEEgbGVhc3QKICAgIHJlY2VudGx5IHVz
ZWQgKExSVSkgYWxnb3JpdGhtIGlzIHVzZWQgdG8gZGlzY2FyZCBwcmV2aW91c2x5CiAgICByZW5k
ZXJlZCBzdHJpbmdzOyB0aGUgc3BlY2lmaWMgYWxnb3JpdGhtIGlzIHVuZGVmaW5lZCwgYnV0IGlz
CiAgICBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYnkgZmx1c2hpbmcgdW51c2VkIFN0cmluZ3MnIHJl
bmRlcmluZwogICAgcmVzdWx0cyBldmVyeSBmZXcgaHVuZHJlZCByZW5kZXJpbmcgY3ljbGVzLCB3
aGVyZSBhIHJlbmRlcmluZwogICAgY3ljbGUgaXMgZGVmaW5lZCBhcyBhIHBhaXIgb2YgY2FsbHMg
dG8ge0BsaW5rICNiZWdpblJlbmRlcmluZwogICAgYmVnaW5SZW5kZXJpbmd9IC8ge0BsaW5rICNl
bmRSZW5kZXJpbmcgZW5kUmVuZGVyaW5nfS4KCiAgICBAYXV0aG9yIEpvaG4gQnVya2V5CiAgICBA
YXV0aG9yIEtlbm5ldGggUnVzc2VsbAoqLwpwdWJsaWMgY2xhc3MgVGV4dFJlbmRlcmVyIHsKICAg
IHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEZWJ1Zy5kZWJ1ZygiVGV4dFJl
bmRlcmVyIik7CgogICAgLy8gVGhlc2UgYXJlIG9jY2FzaW9uYWxseSB1c2VmdWwgZm9yIG1vcmUg
aW4tZGVwdGggZGVidWdnaW5nCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU0FC
TEVfR0xZUEhfQ0FDSEUgPSBmYWxzZTsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4g
RFJBV19CQk9YRVMgPSBmYWxzZTsKCiAgICBzdGF0aWMgZmluYWwgaW50IGtTaXplID0gMjU2OwoK
ICAgIC8vIEV2ZXJ5IGNlcnRhaW4gbnVtYmVyIG9mIHJlbmRlciBjeWNsZXMsIGZsdXNoIHRoZSBz
dHJpbmdzIHdoaWNoCiAgICAvLyBoYXZlbid0IGJlZW4gdXNlZCByZWNlbnRseQogICAgcHJpdmF0
ZSBzdGF0aWMgZmluYWwgaW50IENZQ0xFU19QRVJfRkxVU0ggPSAxMDA7CgogICAgLy8gVGhlIGFt
b3VudCBvZiB2ZXJ0aWNhbCBkZWFkIHNwYWNlIG9uIHRoZSBiYWNraW5nIHN0b3JlIGJlZm9yZSB3
ZQogICAgLy8gZm9yY2UgYSBjb21wYWN0aW9uCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9h
dCBNQVhfVkVSVElDQUxfRlJBR01FTlRBVElPTiA9IDAuN2Y7CiAgICBzdGF0aWMgZmluYWwgaW50
IGtRdWFkc1BlckJ1ZmZlciA9IDEwMDsKICAgIHN0YXRpYyBmaW5hbCBpbnQga0Nvb3Jkc1BlclZl
cnRWZXJ0cyA9IDM7CiAgICBzdGF0aWMgZmluYWwgaW50IGtDb29yZHNQZXJWZXJ0VGV4ID0gMjsK
ICAgIHN0YXRpYyBmaW5hbCBpbnQga1ZlcnRzUGVyUXVhZCA9IDQ7CiAgICBzdGF0aWMgZmluYWwg
aW50IGtUb3RhbEJ1ZmZlclNpemVWZXJ0cyA9IGtRdWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1
YWQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNWZXJ0cyA9IGtR
dWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1YWQgKiBrQ29vcmRzUGVyVmVydFZlcnRzOwogICAg
c3RhdGljIGZpbmFsIGludCBrVG90YWxCdWZmZXJTaXplQ29vcmRzVGV4ID0ga1F1YWRzUGVyQnVm
ZmVyICoga1ZlcnRzUGVyUXVhZCAqIGtDb29yZHNQZXJWZXJ0VGV4OwogICAgc3RhdGljIGZpbmFs
IGludCBrVG90YWxCdWZmZXJTaXplQnl0ZXNWZXJ0cyA9IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNW
ZXJ0cyAqIDQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVCeXRlc1RleCA9
IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNUZXggKiA0OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6
ZUluQnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSA9IGtDb29yZHNQZXJWZXJ0VmVydHMgKiA0
OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6ZUluQnl0ZXNfT25lVmVydGljZXNfVGV4RGF0YSA9
IGtDb29yZHNQZXJWZXJ0VGV4ICogNDsKICAgIHByaXZhdGUgRm9udCBmb250OwogICAgcHJpdmF0
ZSBib29sZWFuIGFudGlhbGlhc2VkOwogICAgcHJpdmF0ZSBib29sZWFuIHVzZUZyYWN0aW9uYWxN
ZXRyaWNzOwoKICAgIC8vIFdoZXRoZXIgd2UncmUgYXR0ZW1wdGluZyB0byB1c2UgYXV0b21hdGlj
IG1pcG1hcCBnZW5lcmF0aW9uIHN1cHBvcnQKICAgIHByaXZhdGUgYm9vbGVhbiBtaXBtYXA7CiAg
ICBwcml2YXRlIFJlY3RhbmdsZVBhY2tlciBwYWNrZXI7CiAgICBwcml2YXRlIGJvb2xlYW4gaGF2
ZU1heFNpemU7CiAgICBwcml2YXRlIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlOwogICAg
cHJpdmF0ZSBUZXh0dXJlUmVuZGVyZXIgY2FjaGVkQmFja2luZ1N0b3JlOwogICAgcHJpdmF0ZSBH
cmFwaGljczJEIGNhY2hlZEdyYXBoaWNzOwogICAgcHJpdmF0ZSBGb250UmVuZGVyQ29udGV4dCBj
YWNoZWRGb250UmVuZGVyQ29udGV4dDsKICAgIHByaXZhdGUgTWFwIC8qPFN0cmluZyxSZWN0Piov
IHN0cmluZ0xvY2F0aW9ucyA9IG5ldyBIYXNoTWFwIC8qPFN0cmluZyxSZWN0PiovKCk7CiAgICBw
cml2YXRlIEdseXBoUHJvZHVjZXIgbUdseXBoUHJvZHVjZXI7CgogICAgcHJpdmF0ZSBpbnQgbnVt
UmVuZGVyQ3ljbGVzOwoKICAgIC8vIE5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3Jl
IGluIGEgYmVnaW5SZW5kZXJpbmcoKSAvCiAgICAvLyBlbmRSZW5kZXJpbmcoKSBjeWNsZSBzbyB3
ZSBjYW4gcmUtZW50ZXIgdGhlIGV4YWN0IHNhbWUgc3RhdGUgaWYKICAgIC8vIHdlIGhhdmUgdG8g
cmVhbGxvY2F0ZSB0aGUgYmFja2luZyBzdG9yZQogICAgcHJpdmF0ZSBib29sZWFuIGluQmVnaW5F
bmRQYWlyOwogICAgcHJpdmF0ZSBib29sZWFuIGlzT3J0aG9Nb2RlOwogICAgcHJpdmF0ZSBpbnQg
YmVnaW5SZW5kZXJpbmdXaWR0aDsKICAgIHByaXZhdGUgaW50IGJlZ2luUmVuZGVyaW5nSGVpZ2h0
OwogICAgcHJpdmF0ZSBib29sZWFuIGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQ7Cgog
ICAgLy8gRm9yIHJlc2V0dGluZyB0aGUgY29sb3IgYWZ0ZXIgZGlzcG9zYWwgb2YgdGhlIG9sZCBi
YWNraW5nIHN0b3JlCiAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUNhY2hlZENvbG9yOwogICAgcHJp
dmF0ZSBmbG9hdCBjYWNoZWRSOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRHOwogICAgcHJpdmF0
ZSBmbG9hdCBjYWNoZWRCOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRBOwogICAgcHJpdmF0ZSBD
b2xvciBjYWNoZWRDb2xvcjsKICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9SZXNldENvbG9yOwoK
ICAgIC8vIEZvciBkZWJ1Z2dpbmcgb25seQogICAgcHJpdmF0ZSBGcmFtZSBkYmdGcmFtZTsKCiAg
ICAvLyBEZWJ1Z2dpbmcgcHVycG9zZXMgb25seQogICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnZ2Vk
OwogICAgUGlwZWxpbmVkX1F1YWRSZW5kZXJlciBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyOwogICAg
CiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcKICAgIHByaXZhdGUgYm9vbGVhbiB1c2VW
ZXJ0ZXhBcnJheXMgPSB0cnVlOwogICAgCiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcK
ICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJTSU9OXzFfNTsK
ICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0Zvcl9pc0V4dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJT
SU9OXzFfNTsKCiAgICAvLyBXaGV0aGVyIEdMX0xJTkVBUiBmaWx0ZXJpbmcgaXMgZW5hYmxlZCBm
b3IgdGhlIGJhY2tpbmcgc3RvcmUKICAgIHByaXZhdGUgYm9vbGVhbiBzbW9vdGhpbmcgPSB0cnVl
OwoKICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRSZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBmb250
LCB1c2luZyBubwogICAgICAgIGFudGlhbGlhc2luZyBvciBmcmFjdGlvbmFsIG1ldHJpY3MsIGFu
ZCB0aGUgZGVmYXVsdAogICAgICAgIFJlbmRlckRlbGVnYXRlLiBFcXVpdmFsZW50IHRvIDxjb2Rl
PlRleHRSZW5kZXJlcihmb250LCBmYWxzZSwKICAgICAgICBmYWxzZSk8L2NvZGU+LgoKICAgICAg
ICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0aAogICAgKi8KICAgIHB1YmxpYyBU
ZXh0UmVuZGVyZXIoRm9udCBmb250KSB7CiAgICAgICAgdGhpcyhmb250LCBmYWxzZSwgZmFsc2Us
IG51bGwsIGZhbHNlKTsKICAgIH0KCiAgICAvKiogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIg
d2l0aCB0aGUgZ2l2ZW4gZm9udCwgdXNpbmcgbm8KICAgICAgICBhbnRpYWxpYXNpbmcgb3IgZnJh
Y3Rpb25hbCBtZXRyaWNzLCBhbmQgdGhlIGRlZmF1bHQKICAgICAgICBSZW5kZXJEZWxlZ2F0ZS4g
SWYgPENPREU+bWlwbWFwPC9DT0RFPiBpcyB0cnVlLCBhdHRlbXB0cyB0byB1c2UKICAgICAgICBP
cGVuR0wncyBhdXRvbWF0aWMgbWlwbWFwIGdlbmVyYXRpb24gZm9yIGJldHRlciBzbW9vdGhpbmcg
d2hlbgogICAgICAgIHJlbmRlcmluZyB0aGUgVGV4dHVyZVJlbmRlcmVyJ3MgY29udGVudHMgYXQg
YSBkaXN0YW5jZS4KICAgICAgICBFcXVpdmFsZW50IHRvIDxjb2RlPlRleHRSZW5kZXJlcihmb250
LCBmYWxzZSwgZmFsc2UpPC9jb2RlPi4KCiAgICAgICAgQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8g
cmVuZGVyIHdpdGgKICAgICAgICBAcGFyYW0gbWlwbWFwIHdoZXRoZXIgdG8gYXR0ZW1wdCB1c2Ug
b2YgYXV0b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uCiAgICAqLwogICAgcHVibGljIFRleHRSZW5k
ZXJlcihGb250IGZvbnQsIGJvb2xlYW4gbWlwbWFwKSB7CiAgICAgICAgdGhpcyhmb250LCBmYWxz
ZSwgZmFsc2UsIG51bGwsIG1pcG1hcCk7CiAgICB9CgogICAgLyoqIENyZWF0ZXMgYSBuZXcgVGV4
dFJlbmRlcmVyIHdpdGggdGhlIGdpdmVuIEZvbnQsIHNwZWNpZmllZCBmb250CiAgICAgICAgcHJv
cGVydGllcywgYW5kIGRlZmF1bHQgUmVuZGVyRGVsZWdhdGUuIFRoZQogICAgICAgIDxjb2RlPmFu
dGlhbGlhc2VkPC9jb2RlPiBhbmQgPGNvZGU+dXNlRnJhY3Rpb25hbE1ldHJpY3M8L2NvZGU+CiAg
ICAgICAgZmxhZ3MgcHJvdmlkZSBjb250cm9sIG92ZXIgdGhlIHNhbWUgcHJvcGVydGllcyBhdCB0
aGUgSmF2YSAyRAogICAgICAgIGxldmVsLiBObyBtaXBtYXAgc3VwcG9ydCBpcyByZXF1ZXN0ZWQu
IEVxdWl2YWxlbnQgdG8KICAgICAgICA8Y29kZT5UZXh0UmVuZGVyZXIoZm9udCwgYW50aWFsaWFz
ZWQsIHVzZUZyYWN0aW9uYWxNZXRyaWNzLAogICAgICAgIG51bGwpPC9jb2RlPi4KCiAgICAgICAg
QHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gcmVuZGVyIHdpdGgKICAgICAgICBAcGFyYW0gYW50aWFs
aWFzZWQgd2hldGhlciB0byB1c2UgYW50aWFsaWFzZWQgZm9udHMKICAgICAgICBAcGFyYW0gdXNl
RnJhY3Rpb25hbE1ldHJpY3Mgd2hldGhlciB0byB1c2UgZnJhY3Rpb25hbCBmb250CiAgICAgICAg
bWV0cmljcyBhdCB0aGUgSmF2YSAyRCBsZXZlbAogICAgKi8KICAgIHB1YmxpYyBUZXh0UmVuZGVy
ZXIoRm9udCBmb250LCBib29sZWFuIGFudGlhbGlhc2VkLAogICAgICAgICAgICAgICAgICAgICAg
ICBib29sZWFuIHVzZUZyYWN0aW9uYWxNZXRyaWNzKSB7CiAgICAgICAgdGhpcyhmb250LCBhbnRp
YWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJpY3MsIG51bGwsIGZhbHNlKTsKICAgIH0KCiAgICAv
KiogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gRm9udCwgc3BlY2lm
aWVkIGZvbnQKICAgICAgICBwcm9wZXJ0aWVzLCBhbmQgZ2l2ZW4gUmVuZGVyRGVsZWdhdGUuIFRo
ZQogICAgICAgIDxjb2RlPmFudGlhbGlhc2VkPC9jb2RlPiBhbmQgPGNvZGU+dXNlRnJhY3Rpb25h
bE1ldHJpY3M8L2NvZGU+CiAgICAgICAgZmxhZ3MgcHJvdmlkZSBjb250cm9sIG92ZXIgdGhlIHNh
bWUgcHJvcGVydGllcyBhdCB0aGUgSmF2YSAyRAogICAgICAgIGxldmVsLiBUaGUgPGNvZGU+cmVu
ZGVyRGVsZWdhdGU8L2NvZGU+IHByb3ZpZGVzIG1vcmUgY29udHJvbAogICAgICAgIG92ZXIgdGhl
IHRleHQgcmVuZGVyZWQuIE5vIG1pcG1hcCBzdXBwb3J0IGlzIHJlcXVlc3RlZC4KCiAgICAgICAg
QHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gcmVuZGVyIHdpdGgKICAgICAgICBAcGFyYW0gYW50aWFs
aWFzZWQgd2hldGhlciB0byB1c2UgYW50aWFsaWFzZWQgZm9udHMKICAgICAgICBAcGFyYW0gdXNl
RnJhY3Rpb25hbE1ldHJpY3Mgd2hldGhlciB0byB1c2UgZnJhY3Rpb25hbCBmb250CiAgICAgICAg
bWV0cmljcyBhdCB0aGUgSmF2YSAyRCBsZXZlbAogICAgICAgIEBwYXJhbSByZW5kZXJEZWxlZ2F0
ZSB0aGUgcmVuZGVyIGRlbGVnYXRlIHRvIHVzZSB0byBkcmF3IHRoZQogICAgICAgIHRleHQncyBi
aXRtYXAsIG9yIG51bGwgdG8gdXNlIHRoZSBkZWZhdWx0IG9uZQogICAgKi8KICAgIHB1YmxpYyBU
ZXh0UmVuZGVyZXIoRm9udCBmb250LCBib29sZWFuIGFudGlhbGlhc2VkLAogICAgICAgICAgICAg
ICAgICAgICAgICBib29sZWFuIHVzZUZyYWN0aW9uYWxNZXRyaWNzLCBSZW5kZXJEZWxlZ2F0ZSBy
ZW5kZXJEZWxlZ2F0ZSkgewogICAgICAgIHRoaXMoZm9udCwgYW50aWFsaWFzZWQsIHVzZUZyYWN0
aW9uYWxNZXRyaWNzLCByZW5kZXJEZWxlZ2F0ZSwgZmFsc2UpOwogICAgfQoKICAgIC8qKiBDcmVh
dGVzIGEgbmV3IFRleHRSZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBGb250LCBzcGVjaWZpZWQgZm9u
dAogICAgICAgIHByb3BlcnRpZXMsIGFuZCBnaXZlbiBSZW5kZXJEZWxlZ2F0ZS4gVGhlCiAgICAg
ICAgPGNvZGU+YW50aWFsaWFzZWQ8L2NvZGU+IGFuZCA8Y29kZT51c2VGcmFjdGlvbmFsTWV0cmlj
czwvY29kZT4KICAgICAgICBmbGFncyBwcm92aWRlIGNvbnRyb2wgb3ZlciB0aGUgc2FtZSBwcm9w
ZXJ0aWVzIGF0IHRoZSBKYXZhIDJECiAgICAgICAgbGV2ZWwuIFRoZSA8Y29kZT5yZW5kZXJEZWxl
Z2F0ZTwvY29kZT4gcHJvdmlkZXMgbW9yZSBjb250cm9sCiAgICAgICAgb3ZlciB0aGUgdGV4dCBy
ZW5kZXJlZC4gSWYgPENPREU+bWlwbWFwPC9DT0RFPiBpcyB0cnVlLCBhdHRlbXB0cwogICAgICAg
IHRvIHVzZSBPcGVuR0wncyBhdXRvbWF0aWMgbWlwbWFwIGdlbmVyYXRpb24gZm9yIGJldHRlciBz
bW9vdGhpbmcKICAgICAgICB3aGVuIHJlbmRlcmluZyB0aGUgVGV4dHVyZVJlbmRlcmVyJ3MgY29u
dGVudHMgYXQgYSBkaXN0YW5jZS4KCiAgICAgICAgQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gcmVu
ZGVyIHdpdGgKICAgICAgICBAcGFyYW0gYW50aWFsaWFzZWQgd2hldGhlciB0byB1c2UgYW50aWFs
aWFzZWQgZm9udHMKICAgICAgICBAcGFyYW0gdXNlRnJhY3Rpb25hbE1ldHJpY3Mgd2hldGhlciB0
byB1c2UgZnJhY3Rpb25hbCBmb250CiAgICAgICAgbWV0cmljcyBhdCB0aGUgSmF2YSAyRCBsZXZl
bAogICAgICAgIEBwYXJhbSByZW5kZXJEZWxlZ2F0ZSB0aGUgcmVuZGVyIGRlbGVnYXRlIHRvIHVz
ZSB0byBkcmF3IHRoZQogICAgICAgIHRleHQncyBiaXRtYXAsIG9yIG51bGwgdG8gdXNlIHRoZSBk
ZWZhdWx0IG9uZQogICAgICAgIEBwYXJhbSBtaXBtYXAgd2hldGhlciB0byBhdHRlbXB0IHVzZSBv
ZiBhdXRvbWF0aWMgbWlwbWFwIGdlbmVyYXRpb24KICAgICovCiAgICBwdWJsaWMgVGV4dFJlbmRl
cmVyKEZvbnQgZm9udCwgYm9vbGVhbiBhbnRpYWxpYXNlZCwKICAgICAgICAgICAgICAgICAgICAg
ICAgYm9vbGVhbiB1c2VGcmFjdGlvbmFsTWV0cmljcywgUmVuZGVyRGVsZWdhdGUgcmVuZGVyRGVs
ZWdhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWlwbWFwKSB7CiAgICAgICAg
dGhpcy5mb250ID0gZm9udDsKICAgICAgICB0aGlzLmFudGlhbGlhc2VkID0gYW50aWFsaWFzZWQ7
CiAgICAgICAgdGhpcy51c2VGcmFjdGlvbmFsTWV0cmljcyA9IHVzZUZyYWN0aW9uYWxNZXRyaWNz
OwogICAgICAgIHRoaXMubWlwbWFwID0gbWlwbWFwOwoKICAgICAgICAvLyBGSVhNRTogY29uc2lk
ZXIgYWRqdXN0aW5nIHRoZSBzaXplIGJhc2VkIG9uIGZvbnQgc2l6ZQogICAgICAgIC8vIChpdCB3
aWxsIGFscmVhZHkgYXV0b21hdGljYWxseSByZXNpemUgaWYgbmVjZXNzYXJ5KQogICAgICAgIHBh
Y2tlciA9IG5ldyBSZWN0YW5nbGVQYWNrZXIobmV3IE1hbmFnZXIoKSwga1NpemUsIGtTaXplKTsK
CiAgICAgICAgaWYgKHJlbmRlckRlbGVnYXRlID09IG51bGwpIHsKICAgICAgICAgICAgcmVuZGVy
RGVsZWdhdGUgPSBuZXcgRGVmYXVsdFJlbmRlckRlbGVnYXRlKCk7CiAgICAgICAgfQoKICAgICAg
ICB0aGlzLnJlbmRlckRlbGVnYXRlID0gcmVuZGVyRGVsZWdhdGU7CgogICAgICAgIG1HbHlwaFBy
b2R1Y2VyID0gbmV3IEdseXBoUHJvZHVjZXIoZm9udC5nZXROdW1HbHlwaHMoKSk7CiAgICB9Cgog
ICAgLyoqIFJldHVybnMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgZ2l2ZW4gU3RyaW5n
LCBhc3N1bWluZyBpdAogICAgICAgIHdhcyByZW5kZXJlZCBhdCB0aGUgb3JpZ2luLiBTZWUge0Bs
aW5rICNnZXRCb3VuZHMoQ2hhclNlcXVlbmNlKQogICAgICAgIGdldEJvdW5kcyhDaGFyU2VxdWVu
Y2UpfS4gKi8KICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoU3RyaW5nIHN0cikgewog
ICAgICAgIHJldHVybiBnZXRCb3VuZHMoKENoYXJTZXF1ZW5jZSkgc3RyKTsKICAgIH0KCiAgICAv
KiogUmV0dXJucyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBnaXZlbiBDaGFyU2VxdWVu
Y2UsCiAgICAgICAgYXNzdW1pbmcgaXQgd2FzIHJlbmRlcmVkIGF0IHRoZSBvcmlnaW4uIFRoZSBj
b29yZGluYXRlIHN5c3RlbSBvZgogICAgICAgIHRoZSByZXR1cm5lZCByZWN0YW5nbGUgaXMgSmF2
YSAyRCdzLCB3aXRoIGluY3JlYXNpbmcgWQogICAgICAgIGNvb3JkaW5hdGVzIGluIHRoZSBkb3du
d2FyZCBkaXJlY3Rpb24uIFRoZSByZWxhdGl2ZSBjb29yZGluYXRlCiAgICAgICAgKDAsIDApIGlu
IHRoZSByZXR1cm5lZCByZWN0YW5nbGUgY29ycmVzcG9uZHMgdG8gdGhlIGJhc2VsaW5lIG9mCiAg
ICAgICAgdGhlIGxlZnRtb3N0IGNoYXJhY3RlciBvZiB0aGUgcmVuZGVyZWQgc3RyaW5nLCBpbiBz
aW1pbGFyCiAgICAgICAgZmFzaGlvbiB0byB0aGUgcmVzdWx0cyByZXR1cm5lZCBieSwgZm9yIGV4
YW1wbGUsIHtAbGluawogICAgICAgIGphdmEuYXd0LmZvbnQuR2x5cGhWZWN0b3IjZ2V0VmlzdWFs
Qm91bmRzfS4gTW9zdCBhcHBsaWNhdGlvbnMKICAgICAgICB3aWxsIHVzZSBvbmx5IHRoZSB3aWR0
aCBhbmQgaGVpZ2h0IG9mIHRoZSByZXR1cm5lZCBSZWN0YW5nbGUgZm9yCiAgICAgICAgdGhlIHB1
cnBvc2VzIG9mIGNlbnRlcmluZyBvciBqdXN0aWZ5aW5nIHRoZSBTdHJpbmcuIEl0IGlzIG5vdAog
ICAgICAgIHNwZWNpZmllZCB3aGljaCBKYXZhIDJEIGJvdW5kcyAoe0BsaW5rCiAgICAgICAgamF2
YS5hd3QuZm9udC5HbHlwaFZlY3RvciNnZXRWaXN1YWxCb3VuZHMgZ2V0VmlzdWFsQm91bmRzfSwK
ICAgICAgICB7QGxpbmsgamF2YS5hd3QuZm9udC5HbHlwaFZlY3RvciNnZXRQaXhlbEJvdW5kcyBn
ZXRQaXhlbEJvdW5kc30sCiAgICAgICAgZXRjLikgdGhlIHJldHVybmVkIGJvdW5kcyBjb3JyZXNw
b25kIHRvLCBhbHRob3VnaCBldmVyeSBlZmZvcnQKICAgICAgICBpcyBtYWRlIHRvIGVuc3VyZSBh
biBhY2N1cmF0ZSBib3VuZC4gKi8KICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoQ2hh
clNlcXVlbmNlIHN0cikgewogICAgICAgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBtb3JlIG9w
dGltaXplZCBhbmQgdXNlIHRoZSBnbHlwaCBjYWNoZQogICAgICAgIFJlY3QgciA9IG51bGw7Cgog
ICAgICAgIGlmICgociA9IChSZWN0KSBzdHJpbmdMb2NhdGlvbnMuZ2V0KHN0cikpICE9IG51bGwp
IHsKICAgICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgci5nZXRVc2VyRGF0YSgp
OwoKICAgICAgICAgICAgLy8gUmVjb25zdGl0dXRlIHRoZSBKYXZhIDJEIHJlc3VsdHMgYmFzZWQg
b24gdGhlIGNhY2hlZCB2YWx1ZXMKICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5E
b3VibGUoLWRhdGEub3JpZ2luKCkueCwgLWRhdGEub3JpZ2luKCkueSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgci53KCksIHIuaCgpKTsKICAgICAgICB9CgogICAg
ICAgIC8vIE11c3QgcmV0dXJuIGEgUmVjdGFuZ2xlIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF5b3V0
IGFsZ29yaXRobSAtLQogICAgICAgIC8vIG11c3QgYmUgaWRlbXBvdGVudAogICAgICAgIHJldHVy
biBub3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKHN0ciwgZm9udCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb250UmVuZGVyQ29u
dGV4dCgpKSk7CiAgICB9CgogICAgLyoqIFJldHVybnMgdGhlIEZvbnQgdGhpcyByZW5kZXJlciBp
cyB1c2luZy4gKi8KICAgIHB1YmxpYyBGb250IGdldEZvbnQoKSB7CiAgICAgICAgcmV0dXJuIGZv
bnQ7CiAgICB9CgogICAgLyoqIFJldHVybnMgYSBGb250UmVuZGVyQ29udGV4dCB3aGljaCBjYW4g
YmUgdXNlZCBmb3IgZXh0ZXJuYWwKICAgICAgICB0ZXh0LXJlbGF0ZWQgc2l6ZSBjb21wdXRhdGlv
bnMuIFRoaXMgb2JqZWN0IHNob3VsZCBiZSBjb25zaWRlcmVkCiAgICAgICAgdHJhbnNpZW50IGFu
ZCBtYXkgYmVjb21lIGludmFsaWRhdGVkIGJldHdlZW4ge0BsaW5rCiAgICAgICAgI2JlZ2luUmVu
ZGVyaW5nIGJlZ2luUmVuZGVyaW5nfSAvIHtAbGluayAjZW5kUmVuZGVyaW5nCiAgICAgICAgZW5k
UmVuZGVyaW5nfSBwYWlycy4gKi8KICAgIHB1YmxpYyBGb250UmVuZGVyQ29udGV4dCBnZXRGb250
UmVuZGVyQ29udGV4dCgpIHsKICAgICAgICBpZiAoY2FjaGVkRm9udFJlbmRlckNvbnRleHQgPT0g
bnVsbCkgewogICAgICAgICAgICBjYWNoZWRGb250UmVuZGVyQ29udGV4dCA9IGdldEdyYXBoaWNz
MkQoKS5nZXRGb250UmVuZGVyQ29udGV4dCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNh
Y2hlZEZvbnRSZW5kZXJDb250ZXh0OwogICAgfQoKICAgIC8qKiBCZWdpbnMgcmVuZGVyaW5nIHdp
dGggdGhpcyB7QGxpbmsgVGV4dFJlbmRlcmVyIFRleHRSZW5kZXJlcn0KICAgICAgICBpbnRvIHRo
ZSBjdXJyZW50IE9wZW5HTCBkcmF3YWJsZSwgcHVzaGluZyB0aGUgcHJvamVjdGlvbiBhbmQKICAg
ICAgICBtb2RlbHZpZXcgbWF0cmljZXMgYW5kIHNvbWUgc3RhdGUgYml0cyBhbmQgc2V0dGluZyB1
cCBhCiAgICAgICAgdHdvLWRpbWVuc2lvbmFsIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIHdpdGgg
KDAsIDApIGFzIHRoZQogICAgICAgIGxvd2VyLWxlZnQgY29vcmRpbmF0ZSBhbmQgKHdpZHRoLCBo
ZWlnaHQpIGFzIHRoZSB1cHBlci1yaWdodAogICAgICAgIGNvb3JkaW5hdGUuIEJpbmRzIGFuZCBl
bmFibGVzIHRoZSBpbnRlcm5hbCBPcGVuR0wgdGV4dHVyZQogICAgICAgIG9iamVjdCwgc2V0cyB0
aGUgdGV4dHVyZSBlbnZpcm9ubWVudCBtb2RlIHRvIEdMX01PRFVMQVRFLCBhbmQKICAgICAgICBj
aGFuZ2VzIHRoZSBjdXJyZW50IGNvbG9yIHRvIHRoZSBsYXN0IGNvbG9yIHNldCB3aXRoIHRoaXMK
ICAgICAgICBUZXh0UmVuZGVyZXIgdmlhIHtAbGluayAjc2V0Q29sb3Igc2V0Q29sb3J9LiBUaGlz
IG1ldGhvZAogICAgICAgIGRpc2FibGVzIHRoZSBkZXB0aCB0ZXN0IGFuZCBpcyBlcXVpdmFsZW50
IHRvCiAgICAgICAgYmVnaW5SZW5kZXJpbmcod2lkdGgsIGhlaWdodCwgdHJ1ZSkuCgogICAgICAg
IEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGN1cnJlbnQgb24tc2NyZWVuIE9wZW5HTCBk
cmF3YWJsZQogICAgICAgIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgY3VycmVudCBv
bi1zY3JlZW4gT3BlbkdMIGRyYXdhYmxlCiAgICAgICAgQHRocm93cyBqYXZheC5tZWRpYS5vcGVu
Z2wuR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBiZWdpblJlbmRlcmlu
ZyhpbnQgd2lkdGgsIGludCBoZWlnaHQpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgYmVn
aW5SZW5kZXJpbmcod2lkdGgsIGhlaWdodCwgdHJ1ZSk7CiAgICB9CgogICAgLyoqIEJlZ2lucyBy
ZW5kZXJpbmcgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIgVGV4dFJlbmRlcmVyfQogICAg
ICAgIGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdhYmxlLCBwdXNoaW5nIHRoZSBwcm9qZWN0
aW9uIGFuZAogICAgICAgIG1vZGVsdmlldyBtYXRyaWNlcyBhbmQgc29tZSBzdGF0ZSBiaXRzIGFu
ZCBzZXR0aW5nIHVwIGEKICAgICAgICB0d28tZGltZW5zaW9uYWwgb3J0aG9ncmFwaGljIHByb2pl
Y3Rpb24gd2l0aCAoMCwgMCkgYXMgdGhlCiAgICAgICAgbG93ZXItbGVmdCBjb29yZGluYXRlIGFu
ZCAod2lkdGgsIGhlaWdodCkgYXMgdGhlIHVwcGVyLXJpZ2h0CiAgICAgICAgY29vcmRpbmF0ZS4g
QmluZHMgYW5kIGVuYWJsZXMgdGhlIGludGVybmFsIE9wZW5HTCB0ZXh0dXJlCiAgICAgICAgb2Jq
ZWN0LCBzZXRzIHRoZSB0ZXh0dXJlIGVudmlyb25tZW50IG1vZGUgdG8gR0xfTU9EVUxBVEUsIGFu
ZAogICAgICAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgY29sb3IgdG8gdGhlIGxhc3QgY29sb3Igc2V0
IHdpdGggdGhpcwogICAgICAgIFRleHRSZW5kZXJlciB2aWEge0BsaW5rICNzZXRDb2xvciBzZXRD
b2xvcn0uIERpc2FibGVzIHRoZSBkZXB0aAogICAgICAgIHRlc3QgaWYgdGhlIGRpc2FibGVEZXB0
aFRlc3QgYXJndW1lbnQgaXMgdHJ1ZS4KCiAgICAgICAgQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBv
ZiB0aGUgY3VycmVudCBvbi1zY3JlZW4gT3BlbkdMIGRyYXdhYmxlCiAgICAgICAgQHBhcmFtIGhl
aWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBjdXJyZW50IG9uLXNjcmVlbiBPcGVuR0wgZHJhd2FibGUK
ICAgICAgICBAcGFyYW0gZGlzYWJsZURlcHRoVGVzdCB3aGV0aGVyIHRvIGRpc2FibGUgdGhlIGRl
cHRoIHRlc3QKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0
IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVi
bGljIHZvaWQgYmVnaW5SZW5kZXJpbmcoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIGRp
c2FibGVEZXB0aFRlc3QpCiAgICAgICAgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBiZWdp
blJlbmRlcmluZyh0cnVlLCB3aWR0aCwgaGVpZ2h0LCBkaXNhYmxlRGVwdGhUZXN0KTsKICAgIH0K
CiAgICAvKiogQmVnaW5zIHJlbmRlcmluZyBvZiAyRCB0ZXh0IGluIDNEIHdpdGggdGhpcyB7QGxp
bmsgVGV4dFJlbmRlcmVyCiAgICAgICAgVGV4dFJlbmRlcmVyfSBpbnRvIHRoZSBjdXJyZW50IE9w
ZW5HTCBkcmF3YWJsZS4gQXNzdW1lcyB0aGUgZW5kCiAgICAgICAgdXNlciBpcyByZXNwb25zaWJs
ZSBmb3Igc2V0dGluZyB1cCB0aGUgbW9kZWx2aWV3IGFuZCBwcm9qZWN0aW9uCiAgICAgICAgbWF0
cmljZXMsIGFuZCB3aWxsIHJlbmRlciB0ZXh0IHVzaW5nIHRoZSB7QGxpbmsgI2RyYXczRCBkcmF3
M0R9CiAgICAgICAgbWV0aG9kLiBUaGlzIG1ldGhvZCBwdXNoZXMgc29tZSBPcGVuR0wgc3RhdGUg
Yml0cywgYmluZHMgYW5kCiAgICAgICAgZW5hYmxlcyB0aGUgaW50ZXJuYWwgT3BlbkdMIHRleHR1
cmUgb2JqZWN0LCBzZXRzIHRoZSB0ZXh0dXJlCiAgICAgICAgZW52aXJvbm1lbnQgbW9kZSB0byBH
TF9NT0RVTEFURSwgYW5kIGNoYW5nZXMgdGhlIGN1cnJlbnQgY29sb3IKICAgICAgICB0byB0aGUg
bGFzdCBjb2xvciBzZXQgd2l0aCB0aGlzIFRleHRSZW5kZXJlciB2aWEge0BsaW5rCiAgICAgICAg
I3NldENvbG9yIHNldENvbG9yfS4KCiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBP
cGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAog
ICAgKi8KICAgIHB1YmxpYyB2b2lkIGJlZ2luM0RSZW5kZXJpbmcoKSB0aHJvd3MgR0xFeGNlcHRp
b24gewogICAgICAgIGJlZ2luUmVuZGVyaW5nKGZhbHNlLCAwLCAwLCBmYWxzZSk7CiAgICB9Cgog
ICAgLyoqIENoYW5nZXMgdGhlIGN1cnJlbnQgY29sb3Igb2YgdGhpcyBUZXh0UmVuZGVyZXIgdG8g
dGhlIHN1cHBsaWVkCiAgICAgICAgb25lLiBUaGUgZGVmYXVsdCBjb2xvciBpcyBvcGFxdWUgd2hp
dGUuCgogICAgICAgIEBwYXJhbSBjb2xvciB0aGUgbmV3IGNvbG9yIHRvIHVzZSBmb3IgcmVuZGVy
aW5nIHRleHQKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0
IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVi
bGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgY29sb3IpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAg
ICAgYm9vbGVhbiBub05lZWRGb3JGbHVzaCA9IChoYXZlQ2FjaGVkQ29sb3IgJiYgKGNhY2hlZENv
bG9yICE9IG51bGwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci5l
cXVhbHMoY2FjaGVkQ29sb3IpKTsKCiAgICAgICAgaWYgKCFub05lZWRGb3JGbHVzaCkgewogICAg
ICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUoKTsKICAgICAgICB9CgogICAgICAgIGdldEJhY2tp
bmdTdG9yZSgpLnNldENvbG9yKGNvbG9yKTsKICAgICAgICBoYXZlQ2FjaGVkQ29sb3IgPSB0cnVl
OwogICAgICAgIGNhY2hlZENvbG9yID0gY29sb3I7CiAgICB9CgogICAgLyoqIENoYW5nZXMgdGhl
IGN1cnJlbnQgY29sb3Igb2YgdGhpcyBUZXh0UmVuZGVyZXIgdG8gdGhlIHN1cHBsaWVkCiAgICAg
ICAgb25lLCB3aGVyZSBlYWNoIGNvbXBvbmVudCByYW5nZXMgZnJvbSAwLjBmIC0gMS4wZi4gVGhl
IGFscGhhCiAgICAgICAgY29tcG9uZW50LCBpZiB1c2VkLCBkb2VzIG5vdCBuZWVkIHRvIGJlIHBy
ZW11bHRpcGxpZWQgaW50byB0aGUKICAgICAgICBjb2xvciBjaGFubmVscyBhcyBkZXNjcmliZWQg
aW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHtAbGluawogICAgICAgIGNvbS5zdW4ub3BlbmdsLnV0
aWwudGV4dHVyZS5UZXh0dXJlIFRleHR1cmV9LCBhbHRob3VnaAogICAgICAgIHByZW11bHRpcGxp
ZWQgY29sb3JzIGFyZSB1c2VkIGludGVybmFsbHkuIFRoZSBkZWZhdWx0IGNvbG9yIGlzCiAgICAg
ICAgb3BhcXVlIHdoaXRlLgoKICAgICAgICBAcGFyYW0gciB0aGUgcmVkIGNvbXBvbmVudCBvZiB0
aGUgbmV3IGNvbG9yCiAgICAgICAgQHBhcmFtIGcgdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUg
bmV3IGNvbG9yCiAgICAgICAgQHBhcmFtIGIgdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBuZXcg
Y29sb3IKICAgICAgICBAcGFyYW0gYSB0aGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSBuZXcgY29s
b3IsIDAuMGYgPSBjb21wbGV0ZWx5CiAgICAgICAgdHJhbnNwYXJlbnQsIDEuMGYgPSBjb21wbGV0
ZWx5IG9wYXF1ZQogICAgICAgIEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRl
eHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBw
dWJsaWMgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQog
ICAgICAgIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgYm9vbGVhbiBub05lZWRGb3JGbHVz
aCA9IChoYXZlQ2FjaGVkQ29sb3IgJiYgKGNhY2hlZENvbG9yID09IG51bGwpICYmCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAociA9PSBjYWNoZWRSKSAmJiAoZyA9PSBjYWNoZWRH
KSAmJiAoYiA9PSBjYWNoZWRCKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGEgPT0gY2FjaGVkQSkpOwoKICAgICAgICBpZiAoIW5vTmVlZEZvckZsdXNoKSB7CiAgICAgICAg
ICAgIGZsdXNoR2x5cGhQaXBlbGluZSgpOwogICAgICAgIH0KCiAgICAgICAgZ2V0QmFja2luZ1N0
b3JlKCkuc2V0Q29sb3IociwgZywgYiwgYSk7CiAgICAgICAgaGF2ZUNhY2hlZENvbG9yID0gdHJ1
ZTsKICAgICAgICBjYWNoZWRSID0gcjsKICAgICAgICBjYWNoZWRHID0gZzsKICAgICAgICBjYWNo
ZWRCID0gYjsKICAgICAgICBjYWNoZWRBID0gYTsKICAgICAgICBjYWNoZWRDb2xvciA9IG51bGw7
CiAgICB9CgogICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBDaGFyU2VxdWVuY2UgYXQgdGhlIGRl
c2lyZWQgbG9jYXRpb24gdXNpbmcKICAgICAgICB0aGUgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9y
LiBUaGUgYmFzZWxpbmUgb2YgdGhlIGxlZnRtb3N0CiAgICAgICAgY2hhcmFjdGVyIGlzIGF0IHBv
c2l0aW9uICh4LCB5KSBzcGVjaWZpZWQgaW4gT3BlbkdMIGNvb3JkaW5hdGVzLAogICAgICAgIHdo
ZXJlIHRoZSBvcmlnaW4gaXMgYXQgdGhlIGxvd2VyLWxlZnQgb2YgdGhlIGRyYXdhYmxlIGFuZCB0
aGUgWQogICAgICAgIGNvb3JkaW5hdGUgaW5jcmVhc2VzIGluIHRoZSB1cHdhcmQgZGlyZWN0aW9u
LgoKICAgICAgICBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gZHJhdwogICAgICAgIEBwYXJhbSB4
IHRoZSB4IGNvb3JkaW5hdGUgYXQgd2hpY2ggdG8gZHJhdwogICAgICAgIEBwYXJhbSB5IHRoZSB5
IGNvb3JkaW5hdGUgYXQgd2hpY2ggdG8gZHJhdwogICAgICAgIEB0aHJvd3MgR0xFeGNlcHRpb24g
SWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0aGlzIG1ldGhvZCBpcyBj
YWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBkcmF3KENoYXJTZXF1ZW5jZSBzdHIsIGludCB4
LCBpbnQgeSkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBkcmF3M0Qoc3RyLCB4LCB5LCAw
LCAxKTsKICAgIH0KCiAgICAvKiogRHJhd3MgdGhlIHN1cHBsaWVkIFN0cmluZyBhdCB0aGUgZGVz
aXJlZCBsb2NhdGlvbiB1c2luZyB0aGUKICAgICAgICByZW5kZXJlcidzIGN1cnJlbnQgY29sb3Iu
IFNlZSB7QGxpbmsgI2RyYXcoQ2hhclNlcXVlbmNlLCBpbnQsCiAgICAgICAgaW50KSBkcmF3KENo
YXJTZXF1ZW5jZSwgaW50LCBpbnQpfS4gKi8KICAgIHB1YmxpYyB2b2lkIGRyYXcoU3RyaW5nIHN0
ciwgaW50IHgsIGludCB5KSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGRyYXczRChzdHIs
IHgsIHksIDAsIDEpOwogICAgfQoKICAgIC8qKiBEcmF3cyB0aGUgc3VwcGxpZWQgQ2hhclNlcXVl
bmNlIGF0IHRoZSBkZXNpcmVkIDNEIGxvY2F0aW9uIHVzaW5nCiAgICAgICAgdGhlIHJlbmRlcmVy
J3MgY3VycmVudCBjb2xvci4gVGhlIGJhc2VsaW5lIG9mIHRoZSBsZWZ0bW9zdAogICAgICAgIGNo
YXJhY3RlciBpcyBwbGFjZWQgYXQgcG9zaXRpb24gKHgsIHksIHopIGluIHRoZSBjdXJyZW50CiAg
ICAgICAgY29vcmRpbmF0ZSBzeXN0ZW0uCgogICAgICAgIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0
byBkcmF3CiAgICAgICAgQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBhdCB3aGljaCB0byBkcmF3
CiAgICAgICAgQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBhdCB3aGljaCB0byBkcmF3CiAgICAg
ICAgQHBhcmFtIHogdGhlIHogY29vcmRpbmF0ZSBhdCB3aGljaCB0byBkcmF3CiAgICAgICAgQHBh
cmFtIHNjYWxlRmFjdG9yIGEgdW5pZm9ybSBzY2FsZSBmYWN0b3IgYXBwbGllZCB0byB0aGUgd2lk
dGggYW5kIGhlaWdodCBvZiB0aGUgZHJhd24gcmVjdGFuZ2xlCiAgICAgICAgQHRocm93cyBHTEV4
Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0
aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lkIGRyYXczRChDaGFyU2VxdWVuY2Ug
c3RyLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAgIGZs
b2F0IHNjYWxlRmFjdG9yKSB7CiAgICAgICAgaW50ZXJuYWxfZHJhdzNEKHN0ciwgeCwgeSwgeiwg
c2NhbGVGYWN0b3IpOwogICAgfQoKICAgIC8qKiBEcmF3cyB0aGUgc3VwcGxpZWQgU3RyaW5nIGF0
IHRoZSBkZXNpcmVkIDNEIGxvY2F0aW9uIHVzaW5nIHRoZQogICAgICAgIHJlbmRlcmVyJ3MgY3Vy
cmVudCBjb2xvci4gU2VlIHtAbGluayAjZHJhdzNEKENoYXJTZXF1ZW5jZSwKICAgICAgICBmbG9h
dCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkgZHJhdzNEKENoYXJTZXF1ZW5jZSwgZmxvYXQsIGZsb2F0
LAogICAgICAgIGZsb2F0LCBmbG9hdCl9LiAqLwogICAgcHVibGljIHZvaWQgZHJhdzNEKFN0cmlu
ZyBzdHIsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHNjYWxlRmFjdG9yKSB7CiAg
ICAgICAgaW50ZXJuYWxfZHJhdzNEKHN0ciwgeCwgeSwgeiwgc2NhbGVGYWN0b3IpOwogICAgfQoK
ICAgIC8qKiBSZXR1cm5zIHRoZSBwaXhlbCB3aWR0aCBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyLiAq
LwogICAgcHVibGljIGZsb2F0IGdldENoYXJXaWR0aChjaGFyIGluQ2hhcikgewogICAgICAgIHJl
dHVybiBtR2x5cGhQcm9kdWNlci5nZXRHbHlwaFBpeGVsV2lkdGgoaW5DaGFyKTsKICAgIH0KCiAg
ICAvKiogQ2F1c2VzIHRoZSBUZXh0UmVuZGVyZXIgdG8gZmx1c2ggYW55IGludGVybmFsIGNhY2hl
cyBpdCBtYXkgYmUKICAgICAgICBtYWludGFpbmluZyBhbmQgZHJhdyBpdHMgcmVuZGVyaW5nIHJl
c3VsdHMgdG8gdGhlIHNjcmVlbi4gVGhpcwogICAgICAgIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIg
ZWFjaCBjYWxsIHRvIGRyYXcoKSBpZiB5b3UgYXJlIHNldHRpbmcKICAgICAgICBPcGVuR0wgc3Rh
dGUgc3VjaCBhcyB0aGUgbW9kZWx2aWV3IG1hdHJpeCBiZXR3ZWVuIGNhbGxzIHRvCiAgICAgICAg
ZHJhdygpLiAqLwogICAgcHVibGljIHZvaWQgZmx1c2goKSB7CiAgICAgICAgZmx1c2hHbHlwaFBp
cGVsaW5lKCk7CiAgICB9CgogICAgLyoqIEVuZHMgYSByZW5kZXIgY3ljbGUgd2l0aCB0aGlzIHtA
bGluayBUZXh0UmVuZGVyZXIgVGV4dFJlbmRlcmVyfS4KICAgICAgICBSZXN0b3JlcyB0aGUgcHJv
amVjdGlvbiBhbmQgbW9kZWx2aWV3IG1hdHJpY2VzIGFzIHdlbGwgYXMKICAgICAgICBzZXZlcmFs
IE9wZW5HTCBzdGF0ZSBiaXRzLiBTaG91bGQgYmUgcGFpcmVkIHdpdGgge0BsaW5rCiAgICAgICAg
I2JlZ2luUmVuZGVyaW5nIGJlZ2luUmVuZGVyaW5nfS4KCiAgICAgICAgQHRocm93cyBHTEV4Y2Vw
dGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9k
IGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lkIGVuZFJlbmRlcmluZygpIHRocm93cyBH
TEV4Y2VwdGlvbiB7CiAgICAgICAgZW5kUmVuZGVyaW5nKHRydWUpOwogICAgfQoKICAgIC8qKiBF
bmRzIGEgM0QgcmVuZGVyIGN5Y2xlIHdpdGggdGhpcyB7QGxpbmsgVGV4dFJlbmRlcmVyIFRleHRS
ZW5kZXJlcn0uCiAgICAgICAgUmVzdG9yZXMgc2V2ZXJhbCBPcGVuR0wgc3RhdGUgYml0cy4gU2hv
dWxkIGJlIHBhaXJlZCB3aXRoIHtAbGluawogICAgICAgICNiZWdpbjNEUmVuZGVyaW5nIGJlZ2lu
M0RSZW5kZXJpbmd9LgoKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBj
b250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwog
ICAgcHVibGljIHZvaWQgZW5kM0RSZW5kZXJpbmcoKSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAg
ICAgIGVuZFJlbmRlcmluZyhmYWxzZSk7CiAgICB9CgogICAgLyoqIERpc3Bvc2VzIG9mIGFsbCBy
ZXNvdXJjZXMgdGhpcyBUZXh0UmVuZGVyZXIgaXMgdXNpbmcuIEl0IGlzIG5vdAogICAgICAgIHZh
bGlkIHRvIHVzZSB0aGUgVGV4dFJlbmRlcmVyIGFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4K
CiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3Qg
Y3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lk
IGRpc3Bvc2UoKSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIHBhY2tlci5kaXNwb3NlKCk7
CiAgICAgICAgcGFja2VyID0gbnVsbDsKICAgICAgICBjYWNoZWRCYWNraW5nU3RvcmUgPSBudWxs
OwogICAgICAgIGNhY2hlZEdyYXBoaWNzID0gbnVsbDsKICAgICAgICBjYWNoZWRGb250UmVuZGVy
Q29udGV4dCA9IG51bGw7CgogICAgICAgIGlmIChkYmdGcmFtZSAhPSBudWxsKSB7CiAgICAgICAg
ICAgIGRiZ0ZyYW1lLmRpc3Bvc2UoKTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCiAgICAvLyBJbnRlcm5hbHMgb25seSBiZWxvdyB0aGlzIHBvaW50CiAgICAvLwoKICAgIHBy
aXZhdGUgc3RhdGljIFJlY3RhbmdsZTJEIHByZU5vcm1hbGl6ZShSZWN0YW5nbGUyRCBzcmMpIHsK
ICAgICAgICAvLyBOZWVkIHRvIHJvdW5kIHRvIGludGVnZXIgY29vcmRpbmF0ZXMKICAgICAgICAv
LyBBbHNvIGdpdmUgb3Vyc2VsdmVzIGEgbGl0dGxlIHNsb3AgYXJvdW5kIHRoZSByZXBvcnRlZAog
ICAgICAgIC8vIGJvdW5kcyBvZiBnbHlwaHMgYmVjYXVzZSBpdCBsb29rcyBsaWtlIG5laXRoZXIg
dGhlIHZpc3VhbAogICAgICAgIC8vIG5vciB0aGUgcGl4ZWwgYm91bmRzIHdvcmtzIHBlcmZlY3Rs
eSB3ZWxsCiAgICAgICAgaW50IG1pblggPSAoaW50KSBNYXRoLmZsb29yKHNyYy5nZXRNaW5YKCkp
IC0gMTsKICAgICAgICBpbnQgbWluWSA9IChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblkoKSkg
LSAxOwogICAgICAgIGludCBtYXhYID0gKGludCkgTWF0aC5jZWlsKHNyYy5nZXRNYXhYKCkpICsg
MTsKICAgICAgICBpbnQgbWF4WSA9IChpbnQpIE1hdGguY2VpbChzcmMuZ2V0TWF4WSgpKSArIDE7
CiAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUobWluWCwgbWluWSwgbWF4WCAt
IG1pblgsIG1heFkgLSBtaW5ZKTsKICAgIH0KCgogICAgcHJpdmF0ZSBSZWN0YW5nbGUyRCBub3Jt
YWxpemUoUmVjdGFuZ2xlMkQgc3JjKSB7CiAgICAgICAgLy8gR2l2ZSBvdXJzZWx2ZXMgYSBib3Vu
ZGFyeSBhcm91bmQgZWFjaCBlbnRpdHkgb24gdGhlIGJhY2tpbmcKICAgICAgICAvLyBzdG9yZSBp
biBvcmRlciB0byBwcmV2ZW50IGJsZWVkaW5nIG9mIG5lYXJieSBTdHJpbmdzIGR1ZSB0bwogICAg
ICAgIC8vIHRoZSBmYWN0IHRoYXQgd2UgdXNlIGxpbmVhciBmaWx0ZXJpbmcKCiAgICAgICAgLy8g
Tk9URSB0aGF0IHRoaXMgYm91bmRhcnkgaXMgcXVpdGUgaGV1cmlzdGljIGFuZCBpcyByZWxhdGVk
CiAgICAgICAgLy8gdG8gaG93IGZhciBhd2F5IGluIDNEIHdlIG1heSB2aWV3IHRoZSB0ZXh0IC0t
CiAgICAgICAgLy8gaGV1cmlzdGljYWxseSwgMS41JSBvZiB0aGUgZm9udCdzIGhlaWdodAogICAg
ICAgIGludCBib3VuZGFyeSA9IChpbnQpIE1hdGgubWF4KDEsIDAuMDE1ICogZm9udC5nZXRTaXpl
KCkpOwoKICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZTJELkRvdWJsZSgoaW50KSBNYXRoLmZs
b29yKHNyYy5nZXRNaW5YKCkgLSBib3VuZGFyeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGludCkgTWF0aC5mbG9vcihzcmMuZ2V0TWluWSgpIC0gYm91bmRhcnkpLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChzcmMu
Z2V0V2lkdGgoKSArIDIgKiBib3VuZGFyeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKGludCkgTWF0aC5jZWlsKHNyYy5nZXRIZWlnaHQoKSkgKyAyICogYm91bmRhcnkp
OwogICAgfQoKICAgIHByaXZhdGUgVGV4dHVyZVJlbmRlcmVyIGdldEJhY2tpbmdTdG9yZSgpIHsK
ICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBwYWNr
ZXIuZ2V0QmFja2luZ1N0b3JlKCk7CgogICAgICAgIGlmIChyZW5kZXJlciAhPSBjYWNoZWRCYWNr
aW5nU3RvcmUpIHsKICAgICAgICAgICAgLy8gQmFja2luZyBzdG9yZSBjaGFuZ2VkIHNpbmNlIGxh
c3QgdGltZTsgZGlzY2FyZCBhbnkgY2FjaGVkIEdyYXBoaWNzMkQKICAgICAgICAgICAgaWYgKGNh
Y2hlZEdyYXBoaWNzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzLmRp
c3Bvc2UoKTsKICAgICAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzID0gbnVsbDsKICAgICAgICAg
ICAgICAgIGNhY2hlZEZvbnRSZW5kZXJDb250ZXh0ID0gbnVsbDsKICAgICAgICAgICAgfQoKICAg
ICAgICAgICAgY2FjaGVkQmFja2luZ1N0b3JlID0gcmVuZGVyZXI7CiAgICAgICAgfQoKICAgICAg
ICByZXR1cm4gY2FjaGVkQmFja2luZ1N0b3JlOwogICAgfQoKICAgIHByaXZhdGUgR3JhcGhpY3My
RCBnZXRHcmFwaGljczJEKCkgewogICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdl
dEJhY2tpbmdTdG9yZSgpOwoKICAgICAgICBpZiAoY2FjaGVkR3JhcGhpY3MgPT0gbnVsbCkgewog
ICAgICAgICAgICBjYWNoZWRHcmFwaGljcyA9IHJlbmRlcmVyLmNyZWF0ZUdyYXBoaWNzKCk7Cgog
ICAgICAgICAgICAvLyBTZXQgdXAgY29tcG9zaXRlLCBmb250IGFuZCByZW5kZXJpbmcgaGludHMK
ICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3Muc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRlLlNy
Yyk7CiAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzLnNldENvbG9yKENvbG9yLldISVRFKTsKICAg
ICAgICAgICAgY2FjaGVkR3JhcGhpY3Muc2V0Rm9udChmb250KTsKICAgICAgICAgICAgY2FjaGVk
R3JhcGhpY3Muc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfVEVYVF9BTlRJQUxJ
QVNJTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFudGlh
bGlhc2VkID8gUmVuZGVyaW5nSGludHMuVkFMVUVfVEVYVF9BTlRJQUxJQVNfT04KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSZW5kZXJpbmdIaW50cy5WQUxV
RV9URVhUX0FOVElBTElBU19PRkYpKTsKICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3Muc2V0UmVu
ZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfRlJBQ1RJT05BTE1FVFJJQ1MsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUZyYWN0aW9uYWxNZXRyaWNz
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUmVuZGVyaW5n
SGludHMuVkFMVUVfRlJBQ1RJT05BTE1FVFJJQ1NfT04KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgOiBSZW5kZXJpbmdIaW50cy5WQUxVRV9GUkFDVElPTkFMTUVU
UklDU19PRkYpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjYWNoZWRHcmFwaGljczsKICAg
IH0KCiAgICBwcml2YXRlIHZvaWQgYmVnaW5SZW5kZXJpbmcoYm9vbGVhbiBvcnRobywgaW50IHdp
ZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4g
ZGlzYWJsZURlcHRoVGVzdEZvck9ydGhvKSB7CiAgICAgICAgaWYgKERFQlVHICYmICFkZWJ1Z2dl
ZCkgewogICAgICAgICAgICBkZWJ1ZygpOwogICAgICAgIH0KCiAgICAgICAgaW5CZWdpbkVuZFBh
aXIgPSB0cnVlOwogICAgICAgIGlzT3J0aG9Nb2RlID0gb3J0aG87CiAgICAgICAgYmVnaW5SZW5k
ZXJpbmdXaWR0aCA9IHdpZHRoOwogICAgICAgIGJlZ2luUmVuZGVyaW5nSGVpZ2h0ID0gaGVpZ2h0
OwogICAgICAgIGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQgPSBkaXNhYmxlRGVwdGhU
ZXN0Rm9yT3J0aG87CgogICAgICAgIGlmIChvcnRobykgewogICAgICAgICAgICBnZXRCYWNraW5n
U3RvcmUoKS5iZWdpbk9ydGhvUmVuZGVyaW5nKHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdEZvck9y
dGhvKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5iZWdp
bjNEUmVuZGVyaW5nKCk7CiAgICAgICAgfQoKICAgICAgICBHTCBnbCA9IEdMVS5nZXRDdXJyZW50
R0woKTsKCiAgICAgICAgLy8gUHVzaCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUgcGlw
ZWxpbmVkIHF1YWQgcmVuZGVyZXIKICAgICAgICBnbC5nbFB1c2hDbGllbnRBdHRyaWIoKGludCkg
R0wuR0xfQUxMX0NMSUVOVF9BVFRSSUJfQklUUyk7CgogICAgICAgIGlmICghaGF2ZU1heFNpemUp
IHsKICAgICAgICAgICAgLy8gUXVlcnkgT3BlbkdMIGZvciB0aGUgbWF4aW11bSB0ZXh0dXJlIHNp
emUgYW5kIHNldCBpdCBpbiB0aGUKICAgICAgICAgICAgLy8gUmVjdGFuZ2xlUGFja2VyIHRvIGtl
ZXAgaXQgZnJvbSBleHBhbmRpbmcgdG9vIGxhcmdlCiAgICAgICAgICAgIGludFtdIHN6ID0gbmV3
IGludFsxXTsKICAgICAgICAgICAgZ2wuZ2xHZXRJbnRlZ2VydihHTC5HTF9NQVhfVEVYVFVSRV9T
SVpFLCBzeiwgMCk7CiAgICAgICAgICAgIHBhY2tlci5zZXRNYXhTaXplKHN6WzBdLCBzelswXSk7
CiAgICAgICAgICAgIGhhdmVNYXhTaXplID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmIChu
ZWVkVG9SZXNldENvbG9yICYmIGhhdmVDYWNoZWRDb2xvcikgewogICAgICAgICAgICBpZiAoY2Fj
aGVkQ29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuc2V0
Q29sb3IoY2FjaGVkUiwgY2FjaGVkRywgY2FjaGVkQiwgY2FjaGVkQSk7CiAgICAgICAgICAgIH0g
ZWxzZSB7CiAgICAgICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xvcihjYWNoZWRD
b2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5lZWRUb1Jlc2V0Q29sb3IgPSBmYWxz
ZTsKICAgICAgICB9CgogICAgICAgIC8vIERpc2FibGUgZnV0dXJlIGF0dGVtcHRzIHRvIHVzZSBt
aXBtYXBwaW5nIGlmIFRleHR1cmVSZW5kZXJlcgogICAgICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCBp
dAogICAgICAgIGlmIChtaXBtYXAgJiYgIWdldEJhY2tpbmdTdG9yZSgpLmlzVXNpbmdBdXRvTWlw
bWFwR2VuZXJhdGlvbigpKSB7CiAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAg
ICAgU3lzdGVtLmVyci5wcmludGxuKCJEaXNhYmxlZCBtaXBtYXBwaW5nIGluIFRleHRSZW5kZXJl
ciIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtaXBtYXAgPSBmYWxzZTsKICAgICAgICB9
CiAgICB9CgogICAgLyoqCiAgICAgKiBlbXppYzogaGVyZSB0aGUgY2FsbCB0byBnbEJpbmRCdWZm
ZXIgY3Jhc2hlcyBvbiBjZXJ0YWluIGdyYXBoaWNzY2FyZC9kcml2ZXIgY29tYmluYXRpb25zCiAg
ICAgKiB0aGlzIGlzIHdoeSB0aGUgdWdseSB0cnktY2F0Y2ggYmxvY2sgaGFzIGJlZW4gYWRkZWQs
IHdoaWNoIGZhbGxzIGJhY2sgdG8gdGhlIG9sZCB0ZXh0cmVuZGVyZXIKICAgICAqIAogICAgICog
QHBhcmFtIG9ydGhvCiAgICAgKiBAdGhyb3dzIEdMRXhjZXB0aW9uCiAgICAgKi8KICAgIHByaXZh
dGUgdm9pZCBlbmRSZW5kZXJpbmcoYm9vbGVhbiBvcnRobykgdGhyb3dzIEdMRXhjZXB0aW9uIHsK
ICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUoKTsKCiAgICAgICAgaW5CZWdpbkVuZFBhaXIgPSBm
YWxzZTsKCiAgICAgICAgR0wgZ2wgPSBHTFUuZ2V0Q3VycmVudEdMKCk7CgogICAgICAgIC8vIFBv
cCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUgcGlwZWxpbmVkIHF1YWQgcmVuZGVyZXIK
ICAgICAgICBnbC5nbFBvcENsaWVudEF0dHJpYigpOwoKICAgICAgICAvLyBUaGUgT3BlbkdMIHNw
ZWMgaXMgdW5jbGVhciBhYm91dCB3aGV0aGVyIHRoaXMgY2hhbmdlcyB0aGUKICAgICAgICAvLyBi
dWZmZXIgYmluZGluZ3MsIHNvIHByZWVtcHRpdmVseSB6ZXJvIG91dCB0aGUgR0xfQVJSQVlfQlVG
RkVSCiAgICAgICAgLy8gYmluZGluZwogICAgICAgIGlmIChpczE1QXZhaWxhYmxlKGdsKSkgewog
ICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FS
UkFZX0JVRkZFUiwgMCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAg
ICAgICAgICAgICBpc0V4dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJTSU9OXzFfNSA9IGZhbHNlOwog
ICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAob3J0aG8pIHsKICAgICAgICAgICAg
Z2V0QmFja2luZ1N0b3JlKCkuZW5kT3J0aG9SZW5kZXJpbmcoKTsKICAgICAgICB9IGVsc2Ugewog
ICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5lbmQzRFJlbmRlcmluZygpOwogICAgICAgIH0K
CiAgICAgICAgaWYgKCsrbnVtUmVuZGVyQ3ljbGVzID49IENZQ0xFU19QRVJfRkxVU0gpIHsKICAg
ICAgICAgICAgbnVtUmVuZGVyQ3ljbGVzID0gMDsKCiAgICAgICAgICAgIGlmIChERUJVRykgewog
ICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDbGVhcmluZyB1bnVzZWQgZW50cmll
cyBpbiBlbmRSZW5kZXJpbmcoKSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjbGVhclVu
dXNlZEVudHJpZXMoKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGNsZWFyVW51
c2VkRW50cmllcygpIHsKICAgICAgICBmaW5hbCBqYXZhLnV0aWwuTGlzdCBkZWFkUmVjdHMgPSBu
ZXcgQXJyYXlMaXN0IC8qPFJlY3Q+Ki8oKTsKCiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRo
ZSBjb250ZW50cyBvZiB0aGUgYmFja2luZyBzdG9yZSwgcmVtb3ZpbmcKICAgICAgICAvLyB0ZXh0
IHN0cmluZ3MgdGhhdCBoYXZlbid0IGJlZW4gdXNlZCByZWNlbnRseQogICAgICAgIHBhY2tlci52
aXNpdChuZXcgUmVjdFZpc2l0b3IoKSB7CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNp
dChSZWN0IHJlY3QpIHsKICAgICAgICAgICAgICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRleHRE
YXRhKSByZWN0LmdldFVzZXJEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnVz
ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNsZWFyVXNlZCgpOwogICAgICAg
ICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlYWRSZWN0cy5h
ZGQocmVjdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICB9KTsKCiAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZGVhZFJlY3RzLml0ZXJhdG9y
KCk7IGl0ZXIuaGFzTmV4dCgpOykgewogICAgICAgICAgICBSZWN0IHIgPSAoUmVjdCkgaXRlci5u
ZXh0KCk7CiAgICAgICAgICAgIHBhY2tlci5yZW1vdmUocik7CiAgICAgICAgICAgIHN0cmluZ0xv
Y2F0aW9ucy5yZW1vdmUoKChUZXh0RGF0YSkgci5nZXRVc2VyRGF0YSgpKS5zdHJpbmcoKSk7Cgog
ICAgICAgICAgICBpbnQgdW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUgPSAoKFRleHREYXRhKSByLmdl
dFVzZXJEYXRhKCkpLnVuaWNvZGVJRDsKCiAgICAgICAgICAgIGlmICh1bmljb2RlVG9DbGVhckZy
b21DYWNoZSA+IDApIHsKICAgICAgICAgICAgICAgIG1HbHlwaFByb2R1Y2VyLmNsZWFyQ2FjaGVF
bnRyeSh1bmljb2RlVG9DbGVhckZyb21DYWNoZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAg
IC8vICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgIC8vICAgICAgICBHcmFwaGljczJEIGcg
PSBnZXRHcmFwaGljczJEKCk7CiAgICAgICAgICAgIC8vICAgICAgICBnLnNldENvbXBvc2l0ZShB
bHBoYUNvbXBvc2l0ZS5DbGVhcik7CiAgICAgICAgICAgIC8vICAgICAgICBnLmZpbGxSZWN0KHIu
eCgpLCByLnkoKSwgci53KCksIHIuaCgpKTsKICAgICAgICAgICAgLy8gICAgICAgIGcuc2V0Q29t
cG9zaXRlKEFscGhhQ29tcG9zaXRlLlNyYyk7CiAgICAgICAgICAgIC8vICAgICAgfQogICAgICAg
IH0KCiAgICAgICAgLy8gSWYgd2UgcmVtb3ZlZCBkZWFkIHJlY3RhbmdsZXMgdGhpcyBjeWNsZSwg
dHJ5IHRvIGRvIGEgY29tcGFjdGlvbgogICAgICAgIGZsb2F0IGZyYWcgPSBwYWNrZXIudmVydGlj
YWxGcmFnbWVudGF0aW9uUmF0aW8oKTsKCiAgICAgICAgaWYgKCFkZWFkUmVjdHMuaXNFbXB0eSgp
ICYmIChmcmFnID4gTUFYX1ZFUlRJQ0FMX0ZSQUdNRU5UQVRJT04pKSB7CiAgICAgICAgICAgIGlm
IChERUJVRykgewogICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYWN0aW5nIFRleHRSZW5kZXJlciBiYWNraW5n
IHN0b3JlIGR1ZSB0byB2ZXJ0aWNhbCBmcmFnbWVudGF0aW9uICIgKwogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGZyYWcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwYWNr
ZXIuY29tcGFjdCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAg
IGdldEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eSgwLCAwLCBnZXRCYWNraW5nU3RvcmUoKS5nZXRX
aWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmFja2lu
Z1N0b3JlKCkuZ2V0SGVpZ2h0KCkpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQg
aW50ZXJuYWxfZHJhdzNEKENoYXJTZXF1ZW5jZSBzdHIsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0
IHosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlRmFjdG9yKSB7
CiAgICAgICAgTGlzdC8qPEdseXBoPiovIGdseXBocyA9IG1HbHlwaFByb2R1Y2VyLmdldEdseXBo
cyhzdHIpOwogICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdseXBocy5pdGVyYXRvcigpOyBp
dGVyLmhhc05leHQoKTsgKSB7CiAgICAgICAgICAgIEdseXBoIGdseXBoID0gKEdseXBoKSBpdGVy
Lm5leHQoKTsKICAgICAgICAgICAgZmxvYXQgYWR2YW5jZSA9IGdseXBoLmRyYXczRCh4LCB5LCB6
LCBzY2FsZUZhY3Rvcik7CiAgICAgICAgICAgIHggKz0gYWR2YW5jZSAqIHNjYWxlRmFjdG9yOwog
ICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgZmx1c2hHbHlwaFBpcGVsaW5lKCkgewog
ICAgICAgIGlmIChtUGlwZWxpbmVkUXVhZFJlbmRlcmVyICE9IG51bGwpIHsKICAgICAgICAgICAg
bVBpcGVsaW5lZFF1YWRSZW5kZXJlci5kcmF3KCk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZh
dGUgdm9pZCBkcmF3M0RfUk9CVVNUKENoYXJTZXF1ZW5jZSBzdHIsIGZsb2F0IHgsIGZsb2F0IHks
IGZsb2F0IHosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZUZhY3Rv
cikgewogICAgICAgIFN0cmluZyBjdXJTdHI7CiAgICAgICAgaWYgKHN0ciBpbnN0YW5jZW9mIFN0
cmluZykgewogICAgICAgICAgICBjdXJTdHIgPSAoU3RyaW5nKSBzdHI7CiAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgY3VyU3RyID0gc3RyLnRvU3RyaW5nKCk7CiAgICAgICAgfQoKICAgICAg
ICAvLyBMb29rIHVwIHRoZSBzdHJpbmcgb24gdGhlIGJhY2tpbmcgc3RvcmUKICAgICAgICBSZWN0
IHJlY3QgPSAoUmVjdCkgc3RyaW5nTG9jYXRpb25zLmdldChjdXJTdHIpOwoKICAgICAgICBpZiAo
cmVjdCA9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFJhc3Rlcml6ZSB0aGlzIHN0cmluZyBhbmQg
cGxhY2UgaXQgb24gdGhlIGJhY2tpbmcgc3RvcmUKICAgICAgICAgICAgR3JhcGhpY3MyRCBnID0g
Z2V0R3JhcGhpY3MyRCgpOwogICAgICAgICAgICBSZWN0YW5nbGUyRCBvcmlnQkJveCA9IHByZU5v
cm1hbGl6ZShyZW5kZXJEZWxlZ2F0ZS5nZXRCb3VuZHMoY3VyU3RyLCBmb250LCBnZXRGb250UmVu
ZGVyQ29udGV4dCgpKSk7CiAgICAgICAgICAgIFJlY3RhbmdsZTJEIGJib3ggPSBub3JtYWxpemUo
b3JpZ0JCb3gpOwogICAgICAgICAgICBQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQoKGludCkgLWJi
b3guZ2V0TWluWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkg
LWJib3guZ2V0TWluWSgpKTsKICAgICAgICAgICAgcmVjdCA9IG5ldyBSZWN0KDAsIDAsIChpbnQp
IGJib3guZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIGJib3gu
Z2V0SGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dERhdGEoY3Vy
U3RyLCBvcmlnaW4sIG9yaWdCQm94LCAtMSkpOwoKICAgICAgICAgICAgcGFja2VyLmFkZChyZWN0
KTsKICAgICAgICAgICAgc3RyaW5nTG9jYXRpb25zLnB1dChjdXJTdHIsIHJlY3QpOwoKICAgICAg
ICAgICAgLy8gUmUtZmV0Y2ggdGhlIEdyYXBoaWNzMkQgaW4gY2FzZSB0aGUgYWRkaXRpb24gb2Yg
dGhlIHJlY3RhbmdsZQogICAgICAgICAgICAvLyBjYXVzZWQgdGhlIG9sZCBiYWNraW5nIHN0b3Jl
IHRvIGJlIHRocm93biBhd2F5CiAgICAgICAgICAgIGcgPSBnZXRHcmFwaGljczJEKCk7CgogICAg
ICAgICAgICAvLyBPSywgc2hvdWxkIG5vdyBoYXZlIGFuICh4LCB5KSBmb3IgdGhpcyByZWN0YW5n
bGU7IHJhc3Rlcml6ZQogICAgICAgICAgICAvLyB0aGUgU3RyaW5nCiAgICAgICAgICAgIGludCBz
dHJ4ID0gcmVjdC54KCkgKyBvcmlnaW4ueDsKICAgICAgICAgICAgaW50IHN0cnkgPSByZWN0Lnko
KSArIG9yaWdpbi55OwoKICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBhcmVhIHdlJ3JlIGdv
aW5nIHRvIGRyYXcgaW50bwogICAgICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0
ZS5DbGVhcik7CiAgICAgICAgICAgIGcuZmlsbFJlY3QocmVjdC54KCksIHJlY3QueSgpLCByZWN0
LncoKSwgcmVjdC5oKCkpOwogICAgICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0
ZS5TcmMpOwoKICAgICAgICAgICAgLy8gRHJhdyB0aGUgc3RyaW5nCiAgICAgICAgICAgIHJlbmRl
ckRlbGVnYXRlLmRyYXcoZywgY3VyU3RyLCBzdHJ4LCBzdHJ5KTsKCiAgICAgICAgICAgIGlmIChE
UkFXX0JCT1hFUykgewogICAgICAgICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkg
cmVjdC5nZXRVc2VyRGF0YSgpOwogICAgICAgICAgICAgICAgLy8gRHJhdyBhIGJvdW5kaW5nIGJv
eCBvbiB0aGUgYmFja2luZyBzdG9yZQogICAgICAgICAgICAgICAgZy5kcmF3UmVjdChzdHJ4IC0g
ZGF0YS5vcmlnT3JpZ2luWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ5IC0gZGF0
YS5vcmlnT3JpZ2luWSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBkYXRhLm9y
aWdSZWN0KCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgZGF0
YS5vcmlnUmVjdCgpLmdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgIGcuZHJhd1JlY3Qoc3Ry
eCAtIGRhdGEub3JpZ2luKCkueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyeSAtIGRh
dGEub3JpZ2luKCkueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53KCksCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAg
ICAgLy8gTWFyayB0aGlzIHJlZ2lvbiBvZiB0aGUgVGV4dHVyZVJlbmRlcmVyIGFzIGRpcnR5CiAg
ICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eShyZWN0LngoKSwgcmVjdC55KCks
IHJlY3QudygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5o
KCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gT0ssIG5vdyBkcmF3IHRoZSBwb3J0aW9uIG9mIHRo
ZSBiYWNraW5nIHN0b3JlIHRvIHRoZSBzY3JlZW4KICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVu
ZGVyZXIgPSBnZXRCYWNraW5nU3RvcmUoKTsKCiAgICAgICAgLy8gTk9URSB0aGF0IHRoZSByZWN0
YW5nbGVzIG1hbmFnZWQgYnkgdGhlIHBhY2tlciBoYXZlIHRoZWlyCiAgICAgICAgLy8gb3JpZ2lu
IGF0IHRoZSB1cHBlci1sZWZ0IGJ1dCB0aGUgVGV4dHVyZVJlbmRlcmVyJ3Mgb3JpZ2luIGlzCiAg
ICAgICAgLy8gYXQgaXRzIGxvd2VyIGxlZnQhISEKICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRl
eHREYXRhKSByZWN0LmdldFVzZXJEYXRhKCk7CiAgICAgICAgZGF0YS5tYXJrVXNlZCgpOwoKICAg
ICAgICBSZWN0YW5nbGUyRCBvcmlnUmVjdCA9IGRhdGEub3JpZ1JlY3QoKTsKICAgICAgICAKICAg
ICAgICAvLyBBbGlnbiB0aGUgbGVmdG1vc3QgcG9pbnQgb2YgdGhlIGJhc2VsaW5lIHRvIHRoZSAo
eCwgeSwgeikgY29vcmRpbmF0ZSByZXF1ZXN0ZWQKICAgICAgICByZW5kZXJlci5kcmF3M0RSZWN0
KHggLSAoc2NhbGVGYWN0b3IgKiBkYXRhLm9yaWdPcmlnaW5YKCkpLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgeSAtIChzY2FsZUZhY3RvciAqICgoZmxvYXQpIG9yaWdSZWN0LmdldEhlaWdo
dCgpIC0gZGF0YS5vcmlnT3JpZ2luWSgpKSksIHosCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZWN0LngoKSArIChkYXRhLm9yaWdpbigpLnggLSBkYXRhLm9yaWdPcmlnaW5YKCkpLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkgLSByZWN0LnkoKSAt
IChpbnQpIG9yaWdSZWN0LmdldEhlaWdodCgpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGRhdGEub3JpZ2luKCkueSAtIGRhdGEub3JpZ09yaWdpblkoKSksCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoaW50KSBvcmlnUmVjdC5nZXRXaWR0aCgpLCAoaW50KSBvcmlnUmVjdC5n
ZXRIZWlnaHQoKSwgc2NhbGVGYWN0b3IpOwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAg
Ly8gRGVidWdnaW5nIGZ1bmN0aW9uYWxpdHkKICAgIC8vCiAgICBwcml2YXRlIHZvaWQgZGVidWco
KSB7CiAgICAgICAgZGJnRnJhbWUgPSBuZXcgRnJhbWUoIlRleHRSZW5kZXJlciBEZWJ1ZyBPdXRw
dXQiKTsKCiAgICAgICAgR0xDYW52YXMgZGJnQ2FudmFzID0gbmV3IEdMQ2FudmFzKG5ldyBHTENh
cGFiaWxpdGllcygpLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBHTENvbnRleHQuZ2V0Q3VycmVudCgpLCBudWxsKTsKICAgICAgICBkYmdDYW52YXMuYWRk
R0xFdmVudExpc3RlbmVyKG5ldyBEZWJ1Z0xpc3RlbmVyKGRiZ0ZyYW1lKSk7CiAgICAgICAgZGJn
RnJhbWUuYWRkKGRiZ0NhbnZhcyk7CgogICAgICAgIGZpbmFsIEZQU0FuaW1hdG9yIGFuaW0gPSBu
ZXcgRlBTQW5pbWF0b3IoZGJnQ2FudmFzLCAxMCk7CiAgICAgICAgZGJnRnJhbWUuYWRkV2luZG93
TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKSB7CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9p
ZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBS
dW4gdGhpcyBvbiBhbm90aGVyIHRocmVhZCB0aGFuIHRoZSBBV1QgZXZlbnQgcXVldWUgdG8KICAg
ICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGNhbGwgdG8gQW5pbWF0b3Iuc3RvcCgp
IGNvbXBsZXRlcyBiZWZvcmUKICAgICAgICAgICAgICAgICAgICAvLyBleGl0aW5nCiAgICAgICAg
ICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYW5pbS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg
ICAgICAgICAgICAgICAgIH0pLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg
IH0pOwogICAgICAgIGRiZ0ZyYW1lLnNldFNpemUoa1NpemUsIGtTaXplKTsKICAgICAgICBkYmdG
cmFtZS5zZXRWaXNpYmxlKHRydWUpOwogICAgICAgIGFuaW0uc3RhcnQoKTsKICAgICAgICBkZWJ1
Z2dlZCA9IHRydWU7CiAgICB9CgogICAgLyoqIENsYXNzIHN1cHBvcnRpbmcgbW9yZSBmdWxsIGNv
bnRyb2wgb3ZlciB0aGUgcHJvY2VzcyBvZiByZW5kZXJpbmcKICAgICAgICB0aGUgYml0bWFwcGVk
IHRleHQuIEFsbG93cyBjdXN0b21pemF0aW9uIG9mIHdoZXRoZXIgdGhlIGJhY2tpbmcKICAgICAg
ICBzdG9yZSB0ZXh0IGJpdG1hcCBpcyBmdWxsLWNvbG9yIG9yIGludGVuc2l0eSBvbmx5LCB0aGUg
c2l6ZSBvZgogICAgICAgIGVhY2ggaW5kaXZpZHVhbCByZW5kZXJlZCB0ZXh0IHJlY3RhbmdsZSwg
YW5kIHRoZSBjb250ZW50cyBvZgogICAgICAgIGVhY2ggaW5kaXZpZHVhbCByZW5kZXJlZCB0ZXh0
IHN0cmluZy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICBvZiB0aGlzIGludGVy
ZmFjZSB1c2VzIGFuIGludGVuc2l0eS1vbmx5IHRleHR1cmUsIGEKICAgICAgICBjbG9zZWx5LWNy
b3BwZWQgcmVjdGFuZ2xlIGFyb3VuZCB0aGUgdGV4dCwgYW5kIHJlbmRlcnMgdGV4dAogICAgICAg
IHVzaW5nIHRoZSBjb2xvciB3aGl0ZSwgd2hpY2ggaXMgbW9kdWxhdGVkIGJ5IHRoZSBzZXQgY29s
b3IKICAgICAgICBkdXJpbmcgdGhlIHJlbmRlcmluZyBwcm9jZXNzLiAqLwogICAgcHVibGljIHN0
YXRpYyBpbnRlcmZhY2UgUmVuZGVyRGVsZWdhdGUgewogICAgICAgIC8qKiBJbmRpY2F0ZXMgd2hl
dGhlciB0aGUgYmFja2luZyBzdG9yZSBvZiB0aGlzIFRleHRSZW5kZXJlcgogICAgICAgICAgICBz
aG91bGQgYmUgaW50ZW5zaXR5LW9ubHkgKHRoZSBkZWZhdWx0KSBvciBmdWxsLWNvbG9yLiAqLwog
ICAgICAgIHB1YmxpYyBib29sZWFuIGludGVuc2l0eU9ubHkoKTsKCiAgICAgICAgLyoqIENvbXB1
dGVzIHRoZSBib3VuZHMgb2YgdGhlIGdpdmVuIFN0cmluZyByZWxhdGl2ZSB0byB0aGUKICAgICAg
ICAgICAgb3JpZ2luLiAqLwogICAgICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoU3Ry
aW5nIHN0ciwgRm9udCBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Rm9udFJlbmRlckNvbnRleHQgZnJjKTsKCiAgICAgICAgLyoqIENvbXB1dGVzIHRoZSBib3VuZHMg
b2YgdGhlIGdpdmVuIGNoYXJhY3RlciBzZXF1ZW5jZSByZWxhdGl2ZQogICAgICAgICAgICB0byB0
aGUgb3JpZ2luLiAqLwogICAgICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoQ2hhclNl
cXVlbmNlIHN0ciwgRm9udCBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgRm9udFJlbmRlckNvbnRleHQgZnJjKTsKCiAgICAgICAgLyoqIENvbXB1dGVzIHRoZSBib3Vu
ZHMgb2YgdGhlIGdpdmVuIEdseXBoVmVjdG9yLCBhbHJlYWR5CiAgICAgICAgICAgIGFzc3VtZWQg
dG8gaGF2ZSBiZWVuIGNyZWF0ZWQgZm9yIGEgcGFydGljdWxhciBGb250LAogICAgICAgICAgICBy
ZWxhdGl2ZSB0byB0aGUgb3JpZ2luLiAqLwogICAgICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRC
b3VuZHMoR2x5cGhWZWN0b3IgZ3YsIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7CgogICAgICAgIC8q
KiBSZW5kZXIgdGhlIHBhc3NlZCBjaGFyYWN0ZXIgc2VxdWVuY2UgYXQgdGhlIGRlc2lnbmF0ZWQK
ICAgICAgICAgICAgbG9jYXRpb24gdXNpbmcgdGhlIHN1cHBsaWVkIEdyYXBoaWNzMkQgaW5zdGFu
Y2UuIFRoZQogICAgICAgICAgICBzdXJyb3VuZGluZyByZWdpb24gd2lsbCBhbHJlYWR5IGhhdmUg
YmVlbiBjbGVhcmVkIHRvIHRoZSBSR0IKICAgICAgICAgICAgY29sb3IgKDAsIDAsIDApIHdpdGgg
emVybyBhbHBoYS4gVGhlIGluaXRpYWwgZHJhd2luZyBjb250ZXh0CiAgICAgICAgICAgIG9mIHRo
ZSBwYXNzZWQgR3JhcGhpY3MyRCB3aWxsIGJlIHNldCB0byB1c2UKICAgICAgICAgICAgQWxwaGFD
b21wb3NpdGUuU3JjLCB0aGUgY29sb3Igd2hpdGUsIHRoZSBGb250IHNwZWNpZmllZCBpbiB0aGUK
ICAgICAgICAgICAgVGV4dFJlbmRlcmVyJ3MgY29uc3RydWN0b3IsIGFuZCB0aGUgcmVuZGVyaW5n
IGhpbnRzIHNwZWNpZmllZAogICAgICAgICAgICBpbiB0aGUgVGV4dFJlbmRlcmVyIGNvbnN0cnVj
dG9yLiAgQ2hhbmdlcyBtYWRlIGJ5IHRoZSBlbmQgdXNlcgogICAgICAgICAgICBtYXkgYmUgdmlz
aWJsZSBpbiBzdWNjZXNzaXZlIGNhbGxzIHRvIHRoaXMgbWV0aG9kLCBidXQgYXJlIG5vdAogICAg
ICAgICAgICBndWFyYW50ZWVkIHRvIGJlIHByZXNlcnZlZC4gIEltcGxlbWVudG9ycyBvZiB0aGlz
IG1ldGhvZAogICAgICAgICAgICBzaG91bGQgcmVzZXQgdGhlIEdyYXBoaWNzMkQncyBzdGF0ZSB0
byB0aGF0IGRlc2lyZWQgZWFjaCB0aW1lCiAgICAgICAgICAgIHRoaXMgbWV0aG9kIGlzIGNhbGxl
ZCwgaW4gcGFydGljdWxhciB0aG9zZSBzdGF0ZXMgd2hpY2ggYXJlCiAgICAgICAgICAgIG5vdCB0
aGUgZGVmYXVsdHMuICovCiAgICAgICAgcHVibGljIHZvaWQgZHJhdyhHcmFwaGljczJEIGdyYXBo
aWNzLCBTdHJpbmcgc3RyLCBpbnQgeCwgaW50IHkpOwoKICAgICAgICAvKiogUmVuZGVyIHRoZSBw
YXNzZWQgR2x5cGhWZWN0b3IgYXQgdGhlIGRlc2lnbmF0ZWQgbG9jYXRpb24gdXNpbmcKICAgICAg
ICAgICAgdGhlIHN1cHBsaWVkIEdyYXBoaWNzMkQgaW5zdGFuY2UuIFRoZSBzdXJyb3VuZGluZyBy
ZWdpb24gd2lsbAogICAgICAgICAgICBhbHJlYWR5IGhhdmUgYmVlbiBjbGVhcmVkIHRvIHRoZSBS
R0IgY29sb3IgKDAsIDAsIDApIHdpdGggemVybwogICAgICAgICAgICBhbHBoYS4gVGhlIGluaXRp
YWwgZHJhd2luZyBjb250ZXh0IG9mIHRoZSBwYXNzZWQgR3JhcGhpY3MyRAogICAgICAgICAgICB3
aWxsIGJlIHNldCB0byB1c2UgQWxwaGFDb21wb3NpdGUuU3JjLCB0aGUgY29sb3Igd2hpdGUsIHRo
ZQogICAgICAgICAgICBGb250IHNwZWNpZmllZCBpbiB0aGUgVGV4dFJlbmRlcmVyJ3MgY29uc3Ry
dWN0b3IsIGFuZCB0aGUKICAgICAgICAgICAgcmVuZGVyaW5nIGhpbnRzIHNwZWNpZmllZCBpbiB0
aGUgVGV4dFJlbmRlcmVyIGNvbnN0cnVjdG9yLgogICAgICAgICAgICBDaGFuZ2VzIG1hZGUgYnkg
dGhlIGVuZCB1c2VyIG1heSBiZSB2aXNpYmxlIGluIHN1Y2Nlc3NpdmUKICAgICAgICAgICAgY2Fs
bHMgdG8gdGhpcyBtZXRob2QsIGJ1dCBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VydmVk
LgogICAgICAgICAgICBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIHJlc2V0IHRo
ZSBHcmFwaGljczJEJ3MKICAgICAgICAgICAgc3RhdGUgdG8gdGhhdCBkZXNpcmVkIGVhY2ggdGlt
ZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGluCiAgICAgICAgICAgIHBhcnRpY3VsYXIgdGhvc2Ug
c3RhdGVzIHdoaWNoIGFyZSBub3QgdGhlIGRlZmF1bHRzLiAqLwogICAgICAgIHB1YmxpYyB2b2lk
IGRyYXdHbHlwaFZlY3RvcihHcmFwaGljczJEIGdyYXBoaWNzLCBHbHlwaFZlY3RvciBzdHIsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7CiAgICB9Cgog
ICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhclNlcXVlbmNlSXRlcmF0b3IgaW1wbGVtZW50cyBD
aGFyYWN0ZXJJdGVyYXRvciB7CiAgICAgICAgQ2hhclNlcXVlbmNlIG1TZXF1ZW5jZTsKICAgICAg
ICBpbnQgbUxlbmd0aDsKICAgICAgICBpbnQgbUN1cnJlbnRJbmRleDsKCiAgICAgICAgQ2hhclNl
cXVlbmNlSXRlcmF0b3IoKSB7CiAgICAgICAgfQoKICAgICAgICBDaGFyU2VxdWVuY2VJdGVyYXRv
cihDaGFyU2VxdWVuY2Ugc2VxdWVuY2UpIHsKICAgICAgICAgICAgaW5pdEZyb21DaGFyU2VxdWVu
Y2Uoc2VxdWVuY2UpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgaW5pdEZyb21DaGFy
U2VxdWVuY2UoQ2hhclNlcXVlbmNlIHNlcXVlbmNlKSB7CiAgICAgICAgICAgIG1TZXF1ZW5jZSA9
IHNlcXVlbmNlOwogICAgICAgICAgICBtTGVuZ3RoID0gbVNlcXVlbmNlLmxlbmd0aCgpOwogICAg
ICAgICAgICBtQ3VycmVudEluZGV4ID0gMDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFy
IGxhc3QoKSB7CiAgICAgICAgICAgIG1DdXJyZW50SW5kZXggPSBNYXRoLm1heCgwLCBtTGVuZ3Ro
IC0gMSk7CgogICAgICAgICAgICByZXR1cm4gY3VycmVudCgpOwogICAgICAgIH0KCiAgICAgICAg
cHVibGljIGNoYXIgY3VycmVudCgpIHsKICAgICAgICAgICAgaWYgKChtTGVuZ3RoID09IDApIHx8
IChtQ3VycmVudEluZGV4ID49IG1MZW5ndGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQ2hh
cmFjdGVySXRlcmF0b3IuRE9ORTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1T
ZXF1ZW5jZS5jaGFyQXQobUN1cnJlbnRJbmRleCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMg
Y2hhciBuZXh0KCkgewogICAgICAgICAgICBtQ3VycmVudEluZGV4Kys7CgogICAgICAgICAgICBy
ZXR1cm4gY3VycmVudCgpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGNoYXIgcHJldmlvdXMo
KSB7CiAgICAgICAgICAgIG1DdXJyZW50SW5kZXggPSBNYXRoLm1heChtQ3VycmVudEluZGV4IC0g
MSwgMCk7CgogICAgICAgICAgICByZXR1cm4gY3VycmVudCgpOwogICAgICAgIH0KCiAgICAgICAg
cHVibGljIGNoYXIgc2V0SW5kZXgoaW50IHBvc2l0aW9uKSB7CiAgICAgICAgICAgIG1DdXJyZW50
SW5kZXggPSBwb3NpdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50KCk7CiAgICAgICAg
fQoKICAgICAgICBwdWJsaWMgaW50IGdldEJlZ2luSW5kZXgoKSB7CiAgICAgICAgICAgIHJldHVy
biAwOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBnZXRFbmRJbmRleCgpIHsKICAgICAg
ICAgICAgcmV0dXJuIG1MZW5ndGg7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgaW50IGdldElu
ZGV4KCkgewogICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRJbmRleDsKICAgICAgICB9CgogICAg
ICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgICAgIENoYXJTZXF1ZW5jZUl0ZXJh
dG9yIGl0ZXIgPSBuZXcgQ2hhclNlcXVlbmNlSXRlcmF0b3IobVNlcXVlbmNlKTsKICAgICAgICAg
ICAgaXRlci5tQ3VycmVudEluZGV4ID0gbUN1cnJlbnRJbmRleDsKCiAgICAgICAgICAgIHJldHVy
biBpdGVyOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGNoYXIgZmlyc3QoKSB7CiAgICAgICAg
ICAgIGlmIChtTGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBDaGFyYWN0ZXJJ
dGVyYXRvci5ET05FOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0g
MDsKCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50KCk7CiAgICAgICAgfQogICAgfQoKICAgIC8v
IERhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcmVjdGFuZ2xlIG9mIHRleHQKICAgIHN0YXRpYyBj
bGFzcyBUZXh0RGF0YSB7CiAgICAgICAgLy8gQmFjay1wb2ludGVyIHRvIFN0cmluZyB0aGlzIFRl
eHREYXRhIGRlc2NyaWJlcywgaWYgaXQKICAgICAgICAvLyByZXByZXNlbnRzIGEgU3RyaW5nIHJh
dGhlciB0aGFuIGEgc2luZ2xlIGdseXBoCiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyOwoKICAg
ICAgICAvLyBJZiB0aGlzIFRleHREYXRhIHJlcHJlc2VudHMgYSBzaW5nbGUgZ2x5cGgsIHRoaXMg
aXMgaXRzCiAgICAgICAgLy8gdW5pY29kZSBJRAogICAgICAgIGludCB1bmljb2RlSUQ7CgogICAg
ICAgIC8vIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBkZWZpbmVkIGFuZCB1c2VkIFZFUlkgcHJlY2lz
ZWx5LiBUaGlzIGlzCiAgICAgICAgLy8gdGhlIG9mZnNldCBmcm9tIHRoZSB1cHBlci1sZWZ0IGNv
cm5lciBvZiB0aGlzIHJlY3RhbmdsZSAoSmF2YQogICAgICAgIC8vIDJEIGNvb3JkaW5hdGUgc3lz
dGVtKSBhdCB3aGljaCB0aGUgc3RyaW5nIG11c3QgYmUgcmFzdGVyaXplZCBpbgogICAgICAgIC8v
IG9yZGVyIHRvIGZpdCB3aXRoaW4gdGhlIHJlY3RhbmdsZSAtLSB0aGUgbGVmdG1vc3QgcG9pbnQg
b2YgdGhlCiAgICAgICAgLy8gYmFzZWxpbmUuCiAgICAgICAgcHJpdmF0ZSBQb2ludCBvcmlnaW47
CgogICAgICAgIC8vIFRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLW5vcm1hbGl6ZWQgcmVjdGFuZ2xl
LCB3aGljaCBmaXRzCiAgICAgICAgLy8gd2l0aGluIHRoZSByZWN0YW5nbGUgb24gdGhlIGJhY2tp
bmcgc3RvcmUuIFdlIGtlZXAgYQogICAgICAgIC8vIG9uZS1waXhlbCBib3JkZXIgYXJvdW5kIGVu
dHJpZXMgb24gdGhlIGJhY2tpbmcgc3RvcmUgdG8KICAgICAgICAvLyBwcmV2ZW50IGJsZWVkaW5n
IG9mIGFkamFjZW50IGxldHRlcnMgd2hlbiB1c2luZyBHTF9MSU5FQVIKICAgICAgICAvLyBmaWx0
ZXJpbmcgZm9yIHJlbmRlcmluZy4gVGhlIG9yaWdpbiBvZiB0aGlzIHJlY3RhbmdsZSBpcwogICAg
ICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbiBhYm92ZS4KICAgICAgICBwcml2YXRlIFJl
Y3RhbmdsZTJEIG9yaWdSZWN0OwoKICAgICAgICBwcml2YXRlIGJvb2xlYW4gdXNlZDsgLy8gV2hl
dGhlciB0aGlzIHRleHQgd2FzIHVzZWQgcmVjZW50bHkKCiAgICAgICAgVGV4dERhdGEoU3RyaW5n
IHN0ciwgUG9pbnQgb3JpZ2luLCBSZWN0YW5nbGUyRCBvcmlnUmVjdCwgaW50IHVuaWNvZGVJRCkg
ewogICAgICAgICAgICB0aGlzLnN0ciA9IHN0cjsKICAgICAgICAgICAgdGhpcy5vcmlnaW4gPSBv
cmlnaW47CiAgICAgICAgICAgIHRoaXMub3JpZ1JlY3QgPSBvcmlnUmVjdDsKICAgICAgICAgICAg
dGhpcy51bmljb2RlSUQgPSB1bmljb2RlSUQ7CiAgICAgICAgfQoKICAgICAgICBTdHJpbmcgc3Ry
aW5nKCkgewogICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgIH0KCiAgICAgICAgUG9pbnQg
b3JpZ2luKCkgewogICAgICAgICAgICByZXR1cm4gb3JpZ2luOwogICAgICAgIH0KCiAgICAgICAg
Ly8gVGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzIGFyZSB1c2VkIHRvIGxvY2F0ZSB0aGUgZ2x5
cGgKICAgICAgICAvLyB3aXRoaW4gdGhlIGV4cGFuZGVkIHJlY3RhbmdsZSBjb21pbmcgZnJvbSBu
b3JtYWxpemUoKQogICAgICAgIGludCBvcmlnT3JpZ2luWCgpIHsKICAgICAgICAgICAgcmV0dXJu
IChpbnQpIC1vcmlnUmVjdC5nZXRNaW5YKCk7CiAgICAgICAgfQoKICAgICAgICBpbnQgb3JpZ09y
aWdpblkoKSB7CiAgICAgICAgICAgIHJldHVybiAoaW50KSAtb3JpZ1JlY3QuZ2V0TWluWSgpOwog
ICAgICAgIH0KCiAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QoKSB7CiAgICAgICAgICAgIHJl
dHVybiBvcmlnUmVjdDsKICAgICAgICB9CgogICAgICAgIGJvb2xlYW4gdXNlZCgpIHsKICAgICAg
ICAgICAgcmV0dXJuIHVzZWQ7CiAgICAgICAgfQoKICAgICAgICB2b2lkIG1hcmtVc2VkKCkgewog
ICAgICAgICAgICB1c2VkID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZvaWQgY2xlYXJVc2Vk
KCkgewogICAgICAgICAgICB1c2VkID0gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIGNsYXNz
IE1hbmFnZXIgaW1wbGVtZW50cyBCYWNraW5nU3RvcmVNYW5hZ2VyIHsKICAgICAgICBwcml2YXRl
IEdyYXBoaWNzMkQgZzsKCiAgICAgICAgcHVibGljIE9iamVjdCBhbGxvY2F0ZUJhY2tpbmdTdG9y
ZShpbnQgdywgaW50IGgpIHsKICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBjb25zaWRlciBj
aGVja2luZyBGb250J3MgYXR0cmlidXRlcyB0byBzZWUKICAgICAgICAgICAgLy8gd2hldGhlciB3
ZSdyZSBsaWtlbHkgdG8gbmVlZCB0byBzdXBwb3J0IGEgZnVsbCBSR0JBIGJhY2tpbmcKICAgICAg
ICAgICAgLy8gc3RvcmUgKGkuZS4sIG5vbi1kZWZhdWx0IFBhaW50LCBmb3JlZ3JvdW5kIGNvbG9y
LCBldGMuKSwgYnV0CiAgICAgICAgICAgIC8vIGZvciBub3csIGxldCdzIGp1c3QgYmUgbW9yZSBl
ZmZpY2llbnQKICAgICAgICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRlcmVyOwoKICAgICAgICAg
ICAgaWYgKHJlbmRlckRlbGVnYXRlLmludGVuc2l0eU9ubHkoKSkgewogICAgICAgICAgICAgICAg
cmVuZGVyZXIgPSBUZXh0dXJlUmVuZGVyZXIuY3JlYXRlQWxwaGFPbmx5UmVuZGVyZXIodywgaCwg
bWlwbWFwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlbmRlcmVyID0g
bmV3IFRleHR1cmVSZW5kZXJlcih3LCBoLCB0cnVlLCBtaXBtYXApOwogICAgICAgICAgICB9CiAg
ICAgICAgICAgIHJlbmRlcmVyLnNldFNtb290aGluZyhzbW9vdGhpbmcpOwoKICAgICAgICAgICAg
aWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiBUZXh0UmVu
ZGVyZXIgYWxsb2NhdGluZyBiYWNraW5nIHN0b3JlICIgKwogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHcgKyAiIHggIiArIGgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBy
ZXR1cm4gcmVuZGVyZXI7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGVCYWNr
aW5nU3RvcmUoT2JqZWN0IGJhY2tpbmdTdG9yZSkgewogICAgICAgICAgICAoKFRleHR1cmVSZW5k
ZXJlcikgYmFja2luZ1N0b3JlKS5kaXNwb3NlKCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMg
Ym9vbGVhbiBwcmVFeHBhbmQoUmVjdCBjYXVzZSwgaW50IGF0dGVtcHROdW1iZXIpIHsKICAgICAg
ICAgICAgLy8gT25seSB0cnkgdGhpcyBvbmUgdGltZTsgY2xlYXIgb3V0IHBvdGVudGlhbGx5IG9i
c29sZXRlIGVudHJpZXMKICAgICAgICAgICAgLy8gTk9URTogdGhpcyBoZXVyaXN0aWMgYW5kIHRo
ZSBmYWN0IHRoYXQgaXQgY2xlYXJzIHRoZSB1c2VkIGJpdAogICAgICAgICAgICAvLyBvZiBhbGwg
ZW50cmllcyBzZWVtcyB0byBjYXVzZSBjeWNsaW5nIG9mIGVudHJpZXMgaW4gc29tZQogICAgICAg
ICAgICAvLyBzaXR1YXRpb25zLCB3aGVyZSB0aGUgYmFja2luZyBzdG9yZSBiZWNvbWVzIHNtYWxs
IGNvbXBhcmVkIHRvCiAgICAgICAgICAgIC8vIHRoZSBhbW91bnQgb2YgdGV4dCBvbiB0aGUgc2Ny
ZWVuIChzZWUgdGhlIFRleHRGbG93IGRlbW8pIGFuZAogICAgICAgICAgICAvLyB0aGUgZW50cmll
cyBjb250aW51YWxseSBjeWNsZSBpbiBhbmQgb3V0IG9mIHRoZSBiYWNraW5nCiAgICAgICAgICAg
IC8vIHN0b3JlLCBkZWNyZWFzaW5nIHBlcmZvcm1hbmNlLiBJZiB3ZSBhZGRlZCBhIGxpdHRsZSBh
Z2UKICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gdG8gdGhlIGVudHJpZXMsIGFuZCBvbmx5IGNs
ZWFyZWQgb3V0IGVudHJpZXMKICAgICAgICAgICAgLy8gYWJvdmUgYSBjZXJ0YWluIGFnZSwgdGhp
cyBiZWhhdmlvciB3b3VsZCBiZSBlbGltaW5hdGVkLgogICAgICAgICAgICAvLyBIb3dldmVyLCBp
dCBzZWVtcyB0aGUgc3lzdGVtIHVzdWFsbHkgc3RhYmlsaXplcyBpdHNlbGYsIHNvCiAgICAgICAg
ICAgIC8vIGZvciBub3cgd2UnbGwganVzdCBrZWVwIHRoaW5ncyBzaW1wbGUuIE5vdGUgdGhhdCBp
ZiB3ZSBkb24ndAogICAgICAgICAgICAvLyBjbGVhciB0aGUgdXNlZCBiaXQgaGVyZSwgdGhlIGJh
Y2tpbmcgc3RvcmUgdGVuZHMgdG8gaW5jcmVhc2UKICAgICAgICAgICAgLy8gdmVyeSBxdWlja2x5
IHRvIGl0cyBtYXhpbXVtIHNpemUsIGF0IGxlYXN0IHdpdGggdGhlIFRleHRGbG93CiAgICAgICAg
ICAgIC8vIGRlbW8gd2hlbiB0aGUgdGV4dCBpcyBiZWluZyBjb250aW51YWxseSByZS1sYWlkIG91
dC4KICAgICAgICAgICAgaWYgKGF0dGVtcHROdW1iZXIgPT0gMCkgewogICAgICAgICAgICAgICAg
aWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAogICAg
ICAgICAgICAgICAgICAgICAgICAiQ2xlYXJpbmcgdW51c2VkIGVudHJpZXMgaW4gcHJlRXhwYW5k
KCk6IGF0dGVtcHQgbnVtYmVyICIgKwogICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0TnVt
YmVyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaW5CZWdpbkVuZFBh
aXIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBEcmF3IGFueSBvdXRzdGFuZGluZyBnbHlwaHMK
ICAgICAgICAgICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAg
ICAgICAgIGNsZWFyVW51c2VkRW50cmllcygpOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAg
ICAgICBwdWJsaWMgdm9pZCBhZGRpdGlvbkZhaWxlZChSZWN0IGNhdXNlLCBpbnQgYXR0ZW1wdE51
bWJlcikgewogICAgICAgICAgICAvLyBIZWF2eSBoYW1tZXIgLS0gbWlnaHQgY29uc2lkZXIgZG9p
bmcgc29tZXRoaW5nIGRpZmZlcmVudAogICAgICAgICAgICBwYWNrZXIuY2xlYXIoKTsKICAgICAg
ICAgICAgc3RyaW5nTG9jYXRpb25zLmNsZWFyKCk7CiAgICAgICAgICAgIG1HbHlwaFByb2R1Y2Vy
LmNsZWFyQWxsQ2FjaGVFbnRyaWVzKCk7CgogICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAg
ICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiICoqKiBDbGVhcmVkIGFsbCB0ZXh0IGJlY2F1c2UgYWRkaXRpb24gZmFpbGVkICoq
KiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBiZWdpbk1v
dmVtZW50KE9iamVjdCBvbGRCYWNraW5nU3RvcmUsIE9iamVjdCBuZXdCYWNraW5nU3RvcmUpIHsK
ICAgICAgICAgICAgLy8gRXhpdCB0aGUgYmVnaW4gLyBlbmQgcGFpciBpZiBuZWNlc3NhcnkKICAg
ICAgICAgICAgaWYgKGluQmVnaW5FbmRQYWlyKSB7CiAgICAgICAgICAgICAgICAvLyBEcmF3IGFu
eSBvdXRzdGFuZGluZyBnbHlwaHMKICAgICAgICAgICAgICAgIGZsdXNoKCk7CgogICAgICAgICAg
ICAgICAgR0wgZ2wgPSBHTFUuZ2V0Q3VycmVudEdMKCk7CgogICAgICAgICAgICAgICAgLy8gUG9w
IGNsaWVudCBhdHRyaWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgog
ICAgICAgICAgICAgICAgZ2wuZ2xQb3BDbGllbnRBdHRyaWIoKTsKCiAgICAgICAgICAgICAgICAv
LyBUaGUgT3BlbkdMIHNwZWMgaXMgdW5jbGVhciBhYm91dCB3aGV0aGVyIHRoaXMgY2hhbmdlcyB0
aGUKICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBiaW5kaW5ncywgc28gcHJlZW1wdGl2ZWx5IHpl
cm8gb3V0IHRoZSBHTF9BUlJBWV9CVUZGRVIKICAgICAgICAgICAgICAgIC8vIGJpbmRpbmcKICAg
ICAgICAgICAgICAgIGlmIChpczE1QXZhaWxhYmxlKGdsKSkgewogICAgICAgICAgICAgICAgICAg
IHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJB
WV9CVUZGRVIsIDApOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7
CiAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZW5zaW9uQXZhaWxhYmxlX0dMX1ZFUlNJT05f
MV81ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAg
ICAgICAgICAgICAgIGlmIChpc09ydGhvTW9kZSkgewogICAgICAgICAgICAgICAgICAgICgoVGV4
dHVyZVJlbmRlcmVyKSBvbGRCYWNraW5nU3RvcmUpLmVuZE9ydGhvUmVuZGVyaW5nKCk7CiAgICAg
ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICgoVGV4dHVyZVJlbmRlcmVy
KSBvbGRCYWNraW5nU3RvcmUpLmVuZDNEUmVuZGVyaW5nKCk7CiAgICAgICAgICAgICAgICB9CiAg
ICAgICAgICAgIH0KCiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBuZXdSZW5kZXJlciA9IChU
ZXh0dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZTsKICAgICAgICAgICAgZyA9IG5ld1JlbmRl
cmVyLmNyZWF0ZUdyYXBoaWNzKCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBtb3Zl
KE9iamVjdCBvbGRCYWNraW5nU3RvcmUsIFJlY3Qgb2xkTG9jYXRpb24sCiAgICAgICAgICAgICAg
ICAgICAgICAgICBPYmplY3QgbmV3QmFja2luZ1N0b3JlLCBSZWN0IG5ld0xvY2F0aW9uKSB7CiAg
ICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBvbGRSZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIp
IG9sZEJhY2tpbmdTdG9yZTsKICAgICAgICAgICAgVGV4dHVyZVJlbmRlcmVyIG5ld1JlbmRlcmVy
ID0gKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlOwoKICAgICAgICAgICAgaWYgKG9s
ZFJlbmRlcmVyID09IG5ld1JlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAvLyBNb3ZlbWVudCBv
biB0aGUgc2FtZSBiYWNraW5nIHN0b3JlIC0tIGVhc3kgY2FzZQogICAgICAgICAgICAgICAgZy5j
b3B5QXJlYShvbGRMb2NhdGlvbi54KCksIG9sZExvY2F0aW9uLnkoKSwgb2xkTG9jYXRpb24udygp
LAogICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2NhdGlvbi5oKCksIG5ld0xvY2F0aW9u
LngoKSAtIG9sZExvY2F0aW9uLngoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TG9j
YXRpb24ueSgpIC0gb2xkTG9jYXRpb24ueSgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgICAgICAgIC8vIE5lZWQgdG8gZHJhdyBmcm9tIHRoZSBvbGQgcmVuZGVyZXIncyBpbWFnZSBp
bnRvIHRoZSBuZXcgb25lCiAgICAgICAgICAgICAgICBJbWFnZSBpbWcgPSBvbGRSZW5kZXJlci5n
ZXRJbWFnZSgpOwogICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1nLCBuZXdMb2NhdGlvbi54
KCksIG5ld0xvY2F0aW9uLnkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xvY2F0
aW9uLngoKSArIG5ld0xvY2F0aW9uLncoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5l
d0xvY2F0aW9uLnkoKSArIG5ld0xvY2F0aW9uLmgoKSwgb2xkTG9jYXRpb24ueCgpLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgb2xkTG9jYXRpb24ueSgpLCBvbGRMb2NhdGlvbi54KCkgKyBv
bGRMb2NhdGlvbi53KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2NhdGlvbi55
KCkgKyBvbGRMb2NhdGlvbi5oKCksIG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAg
ICAgICBwdWJsaWMgdm9pZCBlbmRNb3ZlbWVudChPYmplY3Qgb2xkQmFja2luZ1N0b3JlLCBPYmpl
Y3QgbmV3QmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgIGcuZGlzcG9zZSgpOwoKICAgICAgICAg
ICAgLy8gU3luYyB0aGUgd2hvbGUgc3VyZmFjZQogICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIg
bmV3UmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBuZXdCYWNraW5nU3RvcmU7CiAgICAgICAg
ICAgIG5ld1JlbmRlcmVyLm1hcmtEaXJ0eSgwLCAwLCBuZXdSZW5kZXJlci5nZXRXaWR0aCgpLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVuZGVyZXIuZ2V0SGVpZ2h0KCkp
OwoKICAgICAgICAgICAgLy8gUmUtZW50ZXIgdGhlIGJlZ2luIC8gZW5kIHBhaXIgaWYgbmVjZXNz
YXJ5CiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewogICAgICAgICAgICAgICAgaWYg
KGlzT3J0aG9Nb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgKChUZXh0dXJlUmVuZGVyZXIpIG5l
d0JhY2tpbmdTdG9yZSkuYmVnaW5PcnRob1JlbmRlcmluZyhiZWdpblJlbmRlcmluZ1dpZHRoLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQsIGJlZ2luUmVuZGVyaW5nRGVw
dGhUZXN0RGlzYWJsZWQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAg
ICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5iZWdpbjNEUmVuZGVyaW5n
KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gUHVzaCBjbGllbnQgYXR0
cmliIGJpdHMgdXNlZCBieSB0aGUgcGlwZWxpbmVkIHF1YWQgcmVuZGVyZXIKICAgICAgICAgICAg
ICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwogICAgICAgICAgICAgICAgZ2wuZ2xQdXNo
Q2xpZW50QXR0cmliKChpbnQpIEdMLkdMX0FMTF9DTElFTlRfQVRUUklCX0JJVFMpOwoKICAgICAg
ICAgICAgICAgIGlmIChoYXZlQ2FjaGVkQ29sb3IpIHsKICAgICAgICAgICAgICAgICAgICBpZiAo
Y2FjaGVkQ29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVS
ZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRSLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
YWNoZWRHLCBjYWNoZWRCLCBjYWNoZWRBKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugewog
ICAgICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3Jl
KS5zZXRDb2xvcihjYWNoZWRDb2xvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmVlZFRvUmVzZXRD
b2xvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0
YXRpYyBjbGFzcyBEZWZhdWx0UmVuZGVyRGVsZWdhdGUgaW1wbGVtZW50cyBSZW5kZXJEZWxlZ2F0
ZSB7CiAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZW5zaXR5T25seSgpIHsKICAgICAgICAgICAg
cmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91
bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICAgICByZXR1cm4g
Z2V0Qm91bmRzKGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJTZXF1ZW5jZUl0ZXJhdG9y
KHN0cikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYyk7CiAgICAgICAgfQoKICAg
ICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKFN0cmluZyBzdHIsIEZvbnQgZm9udCwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZy
YykgewogICAgICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3JlYXRlR2x5cGhWZWN0b3Io
ZnJjLCBzdHIpLCBmcmMpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdl
dEJvdW5kcyhHbHlwaFZlY3RvciBndiwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAgICAgICAg
ICAgIHJldHVybiBndi5nZXRWaXN1YWxCb3VuZHMoKTsKICAgICAgICB9CgogICAgICAgIHB1Ymxp
YyB2b2lkIGRyYXdHbHlwaFZlY3RvcihHcmFwaGljczJEIGdyYXBoaWNzLCBHbHlwaFZlY3RvciBz
dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSkgewog
ICAgICAgICAgICBncmFwaGljcy5kcmF3R2x5cGhWZWN0b3Ioc3RyLCB4LCB5KTsKICAgICAgICB9
CgogICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3MyRCBncmFwaGljcywgU3RyaW5nIHN0
ciwgaW50IHgsIGludCB5KSB7CiAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdTdHJpbmcoc3RyLCB4
LCB5KTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBHbHlwaC1i
eS1nbHlwaCByZW5kZXJpbmcgc3VwcG9ydAogICAgLy8KCiAgICAvLyBBIHRlbXBvcmFyeSB0byBw
cmV2ZW50IGV4Y2Vzc2l2ZSBnYXJiYWdlIGNyZWF0aW9uCiAgICBwcml2YXRlIGNoYXJbXSBzaW5n
bGVVbmljb2RlID0gbmV3IGNoYXJbMV07CgogICAgLyoqIEEgR2x5cGggcmVwcmVzZW50cyBlaXRo
ZXIgYSBzaW5nbGUgdW5pY29kZSBnbHlwaCBvciBhCiAgICAgICAgc3Vic3RyaW5nIG9mIGNoYXJh
Y3RlcnMgdG8gYmUgZHJhd24uIFRoZSByZWFzb24gZm9yIHRoZSBkdWFsCiAgICAgICAgYmVoYXZp
b3IgaXMgc28gdGhhdCB3ZSBjYW4gdGFrZSBpbiBhIHNlcXVlbmNlIG9mIHVuaWNvZGUKICAgICAg
ICBjaGFyYWN0ZXJzIGFuZCBwYXJ0aXRpb24gdGhlbSBpbnRvIHJ1bnMgb2YgaW5kaXZpZHVhbCBn
bHlwaHMsCiAgICAgICAgYnV0IGlmIHdlIGVuY291bnRlciBjb21wbGV4IHRleHQgYW5kL29yIHVu
aWNvZGUgc2VxdWVuY2VzIHdlCiAgICAgICAgZG9uJ3QgdW5kZXJzdGFuZCwgd2UgY2FuIHJlbmRl
ciB0aGVtIHVzaW5nIHRoZQogICAgICAgIHN0cmluZy1ieS1zdHJpbmcgbWV0aG9kLiA8UD4KCiAg
ICAgICAgR2x5cGhzIG5lZWQgdG8gYmUgYWJsZSB0byByZS11cGxvYWQgdGhlbXNlbHZlcyB0byB0
aGUgYmFja2luZwogICAgICAgIHN0b3JlIG9uIGRlbWFuZCBhcyB3ZSBnbyBhbG9uZyBpbiB0aGUg
cmVuZGVyIHNlcXVlbmNlLgogICAgKi8KCiAgICBjbGFzcyBHbHlwaCB7CiAgICAgICAgLy8gSWYg
dGhpcyBHbHlwaCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdW5pY29kZSBnbHlwaCwgdGhpcwog
ICAgICAgIC8vIGlzIGl0cyB1bmljb2RlIElELiBJZiBpdCByZXByZXNlbnRzIGEgU3RyaW5nLCB0
aGlzIGlzIC0xLgogICAgICAgIHByaXZhdGUgaW50IHVuaWNvZGVJRDsKICAgICAgICAvLyBJZiB0
aGUgYWJvdmUgZmllbGQgaXNuJ3QgLTEsIHRoZW4gdGhlc2UgZmllbGRzIGFyZSB1c2VkLgogICAg
ICAgIC8vIFRoZSBnbHlwaCBjb2RlIGluIHRoZSBmb250CiAgICAgICAgcHJpdmF0ZSBpbnQgZ2x5
cGhDb2RlOwogICAgICAgIC8vIFRoZSBHbHlwaFByb2R1Y2VyIHdoaWNoIGNyZWF0ZWQgdXMKICAg
ICAgICBwcml2YXRlIEdseXBoUHJvZHVjZXIgcHJvZHVjZXI7CiAgICAgICAgLy8gVGhlIGFkdmFu
Y2Ugb2YgdGhpcyBnbHlwaAogICAgICAgIHByaXZhdGUgZmxvYXQgYWR2YW5jZTsKICAgICAgICAv
LyBUaGUgR2x5cGhWZWN0b3IgZm9yIHRoaXMgc2luZ2xlIGNoYXJhY3RlcjsgdGhpcyBpcyBwYXNz
ZWQKICAgICAgICAvLyBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGJ1dCBjbGVhcmVkIGR1cmluZyB0
aGUgdXBsb2FkCiAgICAgICAgLy8gcHJvY2VzcwogICAgICAgIHByaXZhdGUgR2x5cGhWZWN0b3Ig
c2luZ2xlVW5pY29kZUdseXBoVmVjdG9yOwogICAgICAgIC8vIFRoZSByZWN0YW5nbGUgb2YgdGhp
cyBnbHlwaCBvbiB0aGUgYmFja2luZyBzdG9yZSwgb3IgbnVsbAogICAgICAgIC8vIGlmIGl0IGhh
cyBiZWVuIGNsZWFyZWQgZHVlIHRvIHNwYWNlIHByZXNzdXJlCiAgICAgICAgcHJpdmF0ZSBSZWN0
IGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nOwogICAgICAgIC8vIElmIHRoaXMgR2x5cGggcmVw
cmVzZW50cyBhIFN0cmluZywgdGhpcyBpcyB0aGUgc2VxdWVuY2Ugb2YKICAgICAgICAvLyBjaGFy
YWN0ZXJzCiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyOwogICAgICAgIC8vIFdoZXRoZXIgd2Ug
bmVlZCBhIHZhbGlkIGFkdmFuY2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBzdHJpbmcKICAgICAgICAv
LyAoaS5lLiwgd2hldGhlciBpdCBoYXMgb3RoZXIgc2luZ2xlIGdseXBocyBjb21pbmcgYWZ0ZXIg
aXQpCiAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRBZHZhbmNlOwoKICAgICAgICAvLyBDcmVh
dGVzIGEgR2x5cGggcmVwcmVzZW50aW5nIGFuIGluZGl2aWR1YWwgVW5pY29kZSBjaGFyYWN0ZXIK
ICAgICAgICBwdWJsaWMgR2x5cGgoaW50IHVuaWNvZGVJRCwKICAgICAgICAgICAgICAgICAgICAg
aW50IGdseXBoQ29kZSwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWR2YW5jZSwKICAgICAg
ICAgICAgICAgICAgICAgR2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUdseXBoVmVjdG9yLAogICAg
ICAgICAgICAgICAgICAgICBHbHlwaFByb2R1Y2VyIHByb2R1Y2VyKSB7CiAgICAgICAgICAgIHRo
aXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAgICAgICAgICB0aGlzLmdseXBoQ29kZSA9IGds
eXBoQ29kZTsKICAgICAgICAgICAgdGhpcy5hZHZhbmNlID0gYWR2YW5jZTsKICAgICAgICAgICAg
dGhpcy5zaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IgPSBzaW5nbGVVbmljb2RlR2x5cGhWZWN0b3I7
CiAgICAgICAgICAgIHRoaXMucHJvZHVjZXIgPSBwcm9kdWNlcjsKICAgICAgICB9CgogICAgICAg
IC8vIENyZWF0ZXMgYSBHbHlwaCByZXByZXNlbnRpbmcgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJz
LCB3aXRoCiAgICAgICAgLy8gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIGFkZGl0aW9uYWwgc2lu
Z2xlIGdseXBocyBhcmUgYmVpbmcKICAgICAgICAvLyByZW5kZXJlZCBhZnRlciBpdAogICAgICAg
IHB1YmxpYyBHbHlwaChTdHJpbmcgc3RyLCBib29sZWFuIG5lZWRBZHZhbmNlKSB7CiAgICAgICAg
ICAgIHRoaXMuc3RyID0gc3RyOwogICAgICAgICAgICB0aGlzLm5lZWRBZHZhbmNlID0gbmVlZEFk
dmFuY2U7CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGlzIGdseXBoJ3MgdW5pY29k
ZSBJRCAqLwogICAgICAgIHB1YmxpYyBpbnQgZ2V0VW5pY29kZUlEKCkgewogICAgICAgICAgICBy
ZXR1cm4gdW5pY29kZUlEOwogICAgICAgIH0KCiAgICAgICAgLyoqIFJldHVybnMgdGhpcyBnbHlw
aCdzIChmb250LXNwZWNpZmljKSBnbHlwaCBjb2RlICovCiAgICAgICAgcHVibGljIGludCBnZXRH
bHlwaENvZGUoKSB7CiAgICAgICAgICAgIHJldHVybiBnbHlwaENvZGU7CiAgICAgICAgfQoKICAg
ICAgICAvKiogUmV0dXJucyB0aGUgYWR2YW5jZSBmb3IgdGhpcyBnbHlwaCAqLwogICAgICAgIHB1
YmxpYyBmbG9hdCBnZXRBZHZhbmNlKCkgewogICAgICAgICAgICByZXR1cm4gYWR2YW5jZTsKICAg
ICAgICB9CgogICAgICAgIC8qKiBEcmF3cyB0aGlzIGdseXBoIGFuZCByZXR1cm5zIHRoZSAoeCkg
YWR2YW5jZSBmb3IgdGhpcyBnbHlwaCAqLwogICAgICAgIHB1YmxpYyBmbG9hdCBkcmF3M0QoZmxv
YXQgaW5YLCBmbG9hdCBpblksIGZsb2F0IHosIGZsb2F0IHNjYWxlRmFjdG9yKSB7CiAgICAgICAg
ICAgIGlmIChzdHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgZHJhdzNEX1JPQlVTVChzdHIs
IGluWCwgaW5ZLCB6LCBzY2FsZUZhY3Rvcik7CiAgICAgICAgICAgICAgICBpZiAoIW5lZWRBZHZh
bmNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAg
ICAgICAgICAgICAgICAvLyBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGFkdmFuY2UgZm9yIHRoaXMg
c3RyaW5nCiAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBndiA9IGZvbnQuY3JlYXRlR2x5cGhW
ZWN0b3IoZ2V0Rm9udFJlbmRlckNvbnRleHQoKSwgc3RyKTsKICAgICAgICAgICAgICAgIGZsb2F0
IHRvdGFsQWR2YW5jZSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGd2
LmdldE51bUdseXBocygpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB0b3RhbEFkdmFuY2Ug
Kz0gZ3YuZ2V0R2x5cGhNZXRyaWNzKGkpLmdldEFkdmFuY2UoKTsKICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CiAgICAgICAgICAgIH0KCiAgICAg
ICAgICAgIC8vIFRoaXMgaXMgdGhlIGNvZGUgcGF0aCB0YWtlbiBmb3IgaW5kaXZpZHVhbCBnbHlw
aHMKICAgICAgICAgICAgaWYgKGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nID09IG51bGwpIHsK
ICAgICAgICAgICAgICAgIHVwbG9hZCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0cnkg
ewogICAgICAgICAgICAgICAgaWYgKG1QaXBlbGluZWRRdWFkUmVuZGVyZXIgPT0gbnVsbCkgewog
ICAgICAgICAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIgPSBuZXcgUGlwZWxpbmVk
X1F1YWRSZW5kZXJlcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIFRleHR1
cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdTdG9yZSgpOwogICAgICAgICAgICAgICAg
Ly8gSGFuZGxlcyBjYXNlIHdoZXJlIE5QT1QgdGV4dHVyZSBpcyB1c2VkIGZvciBiYWNraW5nIHN0
b3JlCiAgICAgICAgICAgICAgICBUZXh0dXJlQ29vcmRzIHdob2xlSW1hZ2VUZXhDb29yZHMgPSBy
ZW5kZXJlci5nZXRUZXh0dXJlKCkuZ2V0SW1hZ2VUZXhDb29yZHMoKTsKICAgICAgICAgICAgICAg
IGZsb2F0IHhTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMucmlnaHQoKTsKICAgICAgICAgICAg
ICAgIGZsb2F0IHlTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMuYm90dG9tKCk7CgogICAgICAg
ICAgICAgICAgUmVjdCByZWN0ID0gZ2x5cGhSZWN0Rm9yVGV4dHVyZU1hcHBpbmc7CiAgICAgICAg
ICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRleHREYXRhKSByZWN0LmdldFVzZXJEYXRhKCk7CiAg
ICAgICAgICAgICAgICBkYXRhLm1hcmtVc2VkKCk7CgogICAgICAgICAgICAgICAgUmVjdGFuZ2xl
MkQgb3JpZ1JlY3QgPSBkYXRhLm9yaWdSZWN0KCk7CgogICAgICAgICAgICAgICAgZmxvYXQgeCA9
IGluWCAtIChzY2FsZUZhY3RvciAqIGRhdGEub3JpZ09yaWdpblgoKSk7CiAgICAgICAgICAgICAg
ICBmbG9hdCB5ID0gaW5ZIC0gKHNjYWxlRmFjdG9yICogKChmbG9hdCkgb3JpZ1JlY3QuZ2V0SGVp
Z2h0KCkgLSBkYXRhLm9yaWdPcmlnaW5ZKCkpKTsKCiAgICAgICAgICAgICAgICBpbnQgdGV4dHVy
ZXggPSByZWN0LngoKSArIChkYXRhLm9yaWdpbigpLnggLSBkYXRhLm9yaWdPcmlnaW5YKCkpOwog
ICAgICAgICAgICAgICAgaW50IHRleHR1cmV5ID0gcmVuZGVyZXIuZ2V0SGVpZ2h0KCkgLSByZWN0
LnkoKSAtIChpbnQpIG9yaWdSZWN0LmdldEhlaWdodCgpIC0KICAgICAgICAgICAgICAgICAgICAo
ZGF0YS5vcmlnaW4oKS55IC0gZGF0YS5vcmlnT3JpZ2luWSgpKTsKICAgICAgICAgICAgICAgIGlu
dCB3aWR0aCA9IChpbnQpIG9yaWdSZWN0LmdldFdpZHRoKCk7CiAgICAgICAgICAgICAgICBpbnQg
aGVpZ2h0ID0gKGludCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCk7CgogICAgICAgICAgICAgICAgZmxv
YXQgdHgxID0geFNjYWxlICogKGZsb2F0KSB0ZXh0dXJleCAvIChmbG9hdCkgcmVuZGVyZXIuZ2V0
V2lkdGgoKTsKICAgICAgICAgICAgICAgIGZsb2F0IHR5MSA9IHlTY2FsZSAqICgxLjBmIC0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KSB0ZXh0dXJleSAvIChm
bG9hdCkgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkpKTsKICAgICAgICAgICAgICAgIGZsb2F0IHR4MiA9
IHhTY2FsZSAqIChmbG9hdCkgKHRleHR1cmV4ICsgd2lkdGgpIC8gKGZsb2F0KSByZW5kZXJlci5n
ZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgZmxvYXQgdHkyID0geVNjYWxlICogKDEuMGYgLQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpICh0ZXh0dXJleSAr
IGhlaWdodCkgLyAoZmxvYXQpIHJlbmRlcmVyLmdldEhlaWdodCgpKSk7CgogICAgICAgICAgICAg
ICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENvb3JkMmYodHgxLCB0eTEpOwogICAgICAg
ICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFZlcnRleDNmKHgsIHksIHopOwogICAg
ICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENvb3JkMmYodHgyLCB0eTEp
OwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFZlcnRleDNmKHggKyAo
d2lkdGggKiBzY2FsZUZhY3RvciksIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgeik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVhZFJlbmRl
cmVyLmdsVGV4Q29vcmQyZih0eDIsIHR5Mik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVh
ZFJlbmRlcmVyLmdsVmVydGV4M2YoeCArICh3aWR0aCAqIHNjYWxlRmFjdG9yKSwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsgKGhlaWdodCAqIHNj
YWxlRmFjdG9yKSwgeik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyLmds
VGV4Q29vcmQyZih0eDEsIHR5Mik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVhZFJlbmRl
cmVyLmdsVmVydGV4M2YoeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB5ICsgKGhlaWdodCAqIHNjYWxlRmFjdG9yKSwgeik7CiAgICAgICAgICAgIH0g
Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgp
OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhZHZhbmNlOwogICAgICAgIH0KCiAg
ICAgICAgLyoqIE5vdGlmaWVzIHRoaXMgZ2x5cGggdGhhdCBpdCdzIGJlZW4gY2xlYXJlZCBvdXQg
b2YgdGhlIGNhY2hlICovCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAgICAgICAgICAg
IGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHBy
aXZhdGUgdm9pZCB1cGxvYWQoKSB7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZ2V0R2x5
cGhWZWN0b3IoKTsKICAgICAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ0JCb3ggPSBwcmVOb3JtYWxp
emUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKGd2LCBnZXRGb250UmVuZGVyQ29udGV4dCgpKSk7
CiAgICAgICAgICAgIFJlY3RhbmdsZTJEIGJib3ggPSBub3JtYWxpemUob3JpZ0JCb3gpOwogICAg
ICAgICAgICBQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQoKGludCkgLWJib3guZ2V0TWluWCgpLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgLWJib3guZ2V0TWluWSgp
KTsKICAgICAgICAgICAgUmVjdCByZWN0ID0gbmV3IFJlY3QoMCwgMCwgKGludCkgYmJveC5nZXRX
aWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBiYm94LmdldEhl
aWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dERhdGEobnVs
bCwgb3JpZ2luLCBvcmlnQkJveCwgdW5pY29kZUlEKSk7CiAgICAgICAgICAgIHBhY2tlci5hZGQo
cmVjdCk7CiAgICAgICAgICAgIGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nID0gcmVjdDsKICAg
ICAgICAgICAgR3JhcGhpY3MyRCBnID0gZ2V0R3JhcGhpY3MyRCgpOwogICAgICAgICAgICAvLyBP
Sywgc2hvdWxkIG5vdyBoYXZlIGFuICh4LCB5KSBmb3IgdGhpcyByZWN0YW5nbGU7IHJhc3Rlcml6
ZQogICAgICAgICAgICAvLyB0aGUgZ2x5cGgKICAgICAgICAgICAgaW50IHN0cnggPSByZWN0Lngo
KSArIG9yaWdpbi54OwogICAgICAgICAgICBpbnQgc3RyeSA9IHJlY3QueSgpICsgb3JpZ2luLnk7
CgogICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGFyZWEgd2UncmUgZ29pbmcgdG8gZHJhdyBp
bnRvCiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRlLkNsZWFyKTsKICAg
ICAgICAgICAgZy5maWxsUmVjdChyZWN0LngoKSwgcmVjdC55KCksIHJlY3QudygpLCByZWN0Lmgo
KSk7CiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRlLlNyYyk7CgogICAg
ICAgICAgICAvLyBEcmF3IHRoZSBzdHJpbmcKICAgICAgICAgICAgcmVuZGVyRGVsZWdhdGUuZHJh
d0dseXBoVmVjdG9yKGcsIGd2LCBzdHJ4LCBzdHJ5KTsKCiAgICAgICAgICAgIGlmIChEUkFXX0JC
T1hFUykgewogICAgICAgICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5n
ZXRVc2VyRGF0YSgpOwogICAgICAgICAgICAgICAgLy8gRHJhdyBhIGJvdW5kaW5nIGJveCBvbiB0
aGUgYmFja2luZyBzdG9yZQogICAgICAgICAgICAgICAgZy5kcmF3UmVjdChzdHJ4IC0gZGF0YS5v
cmlnT3JpZ2luWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ5IC0gZGF0YS5vcmln
T3JpZ2luWSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBkYXRhLm9yaWdSZWN0
KCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgZGF0YS5vcmln
UmVjdCgpLmdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgIGcuZHJhd1JlY3Qoc3RyeCAtIGRh
dGEub3JpZ2luKCkueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyeSAtIGRhdGEub3Jp
Z2luKCkueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53KCksCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g
TWFyayB0aGlzIHJlZ2lvbiBvZiB0aGUgVGV4dHVyZVJlbmRlcmVyIGFzIGRpcnR5CiAgICAgICAg
ICAgIGdldEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eShyZWN0LngoKSwgcmVjdC55KCksIHJlY3Qu
dygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5oKCkpOwog
ICAgICAgICAgICAvLyBSZS1yZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCBvdXIgcHJvZHVjZXIKICAg
ICAgICAgICAgcHJvZHVjZXIucmVnaXN0ZXIodGhpcyk7CiAgICAgICAgfQoKICAgICAgICBwcml2
YXRlIEdseXBoVmVjdG9yIGdldEdseXBoVmVjdG9yKCkgewogICAgICAgICAgICBHbHlwaFZlY3Rv
ciBndiA9IHNpbmdsZVVuaWNvZGVHbHlwaFZlY3RvcjsKICAgICAgICAgICAgaWYgKGd2ICE9IG51
bGwpIHsKICAgICAgICAgICAgICAgIHNpbmdsZVVuaWNvZGVHbHlwaFZlY3RvciA9IG51bGw7IC8v
IERvbid0IG5lZWQgdGhpcyBhbnltb3JlCiAgICAgICAgICAgICAgICByZXR1cm4gZ3Y7CiAgICAg
ICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IChjaGFyKSB1bmljb2RlSUQ7
CiAgICAgICAgICAgIHJldHVybiBmb250LmNyZWF0ZUdseXBoVmVjdG9yKGdldEZvbnRSZW5kZXJD
b250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBHbHlw
aFByb2R1Y2VyIHsKICAgICAgICBmaW5hbCBpbnQgdW5kZWZpbmVkID0gLTI7CiAgICAgICAgRm9u
dFJlbmRlckNvbnRleHQgZm9udFJlbmRlckNvbnRleHQ7CiAgICAgICAgTGlzdC8qPEdseXBoPiov
IGdseXBoc091dHB1dCA9IG5ldyBBcnJheUxpc3QvKjxHbHlwaD4qLygpOwogICAgICAgIC8vIFRo
ZSBtYXBwaW5nIGZyb20gdW5pY29kZSBjaGFyYWN0ZXIgdG8gZm9udC1zcGVjaWZpYyBnbHlwaCBJ
RAogICAgICAgIGludFtdIHVuaWNvZGVzMkdseXBoczsKICAgICAgICAvLyBUaGUgbWFwcGluZyBm
cm9tIGdseXBoIElEIHRvIEdseXBoCiAgICAgICAgR2x5cGhbXSBnbHlwaENhY2hlOwogICAgICAg
IC8vIFdlIHJlLXVzZSB0aGlzIGZvciBlYWNoIGluY29taW5nIHN0cmluZwogICAgICAgIENoYXJT
ZXF1ZW5jZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQ2hhclNlcXVlbmNlSXRlcmF0b3IoKTsKCiAgICAg
ICAgR2x5cGhQcm9kdWNlcihpbnQgZm9udExlbmd0aEluR2x5cGhzKSB7CiAgICAgICAgICAgIHVu
aWNvZGVzMkdseXBocyA9IG5ldyBpbnRbNTEyXTsKICAgICAgICAgICAgZ2x5cGhDYWNoZSA9IG5l
dyBHbHlwaFtmb250TGVuZ3RoSW5HbHlwaHNdOwogICAgICAgICAgICBjbGVhckFsbENhY2hlRW50
cmllcygpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExpc3QvKjxHbHlwaD4qLyBnZXRHbHlw
aHMoQ2hhclNlcXVlbmNlIGluU3RyaW5nKSB7CiAgICAgICAgICAgIGdseXBoc091dHB1dC5jbGVh
cigpOwogICAgICAgICAgICBpdGVyLmluaXRGcm9tQ2hhclNlcXVlbmNlKGluU3RyaW5nKTsKICAg
ICAgICAgICAgR2x5cGhWZWN0b3IgZnVsbFJ1bkdseXBoVmVjdG9yID0gZm9udC5jcmVhdGVHbHlw
aFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIpOwogICAgICAg
ICAgICBib29sZWFuIGNvbXBsZXggPSAoZnVsbFJ1bkdseXBoVmVjdG9yLmdldExheW91dEZsYWdz
KCkgIT0gMCk7CiAgICAgICAgICAgIGlmIChjb21wbGV4IHx8IERJU0FCTEVfR0xZUEhfQ0FDSEUp
IHsKICAgICAgICAgICAgICAgIC8vIFB1bnQgdG8gdGhlIHJvYnVzdCB2ZXJzaW9uIG9mIHRoZSBy
ZW5kZXJlcgogICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFkZChuZXcgR2x5cGgoaW5TdHJp
bmcudG9TdHJpbmcoKSwgZmFsc2UpKTsKICAgICAgICAgICAgICAgIHJldHVybiBnbHlwaHNPdXRw
dXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBsZW5ndGhJbkdseXBocyA9IGZ1bGxS
dW5HbHlwaFZlY3Rvci5nZXROdW1HbHlwaHMoKTsKICAgICAgICAgICAgaW50IGkgPSAwOwogICAg
ICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aEluR2x5cGhzKSB7CiAgICAgICAgICAgICAgICBHbHlw
aCBnbHlwaCA9IGdldEdseXBoKGluU3RyaW5nLCBmdWxsUnVuR2x5cGhWZWN0b3IsIGkpOwogICAg
ICAgICAgICAgICAgaWYgKGdseXBoICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBnbHlw
aHNPdXRwdXQuYWRkKGdseXBoKTsKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEFzc2VtYmxlIGEgcnVuIG9mIGNo
YXJhY3RlcnMgdGhhdCBkb24ndCBmaXQgaW4KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2Fj
aGUKICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZl
cigpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoSW5HbHlwaHMgJiYKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R2x5cGgoaW5TdHJpbmcsIGZ1bGxSdW5HbHlwaFZl
Y3RvciwgaSkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGlu
U3RyaW5nLmNoYXJBdChpKyspKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg
ICAgICAgZ2x5cGhzT3V0cHV0LmFkZChuZXcgR2x5cGgoYnVmLnRvU3RyaW5nKCksCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW55IG1vcmUgZ2x5cGhz
IGFmdGVyIHRoaXMgcnVuPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGkgPCBsZW5ndGhJbkdseXBocykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICB9CiAgICAgICAgICAgIHJldHVybiBnbHlwaHNPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICBw
dWJsaWMgdm9pZCBjbGVhckNhY2hlRW50cnkoaW50IHVuaWNvZGVJRCkgewogICAgICAgICAgICBp
bnQgZ2x5cGhJRCA9IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwogICAgICAgICAgICBpZiAo
Z2x5cGhJRCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIEdseXBoIGdseXBoID0gZ2x5
cGhDYWNoZVtnbHlwaElEXTsKICAgICAgICAgICAgICAgIGlmIChnbHlwaCAhPSBudWxsKSB7CiAg
ICAgICAgICAgICAgICAgICAgZ2x5cGguY2xlYXIoKTsKICAgICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgICAgIGdseXBoQ2FjaGVbZ2x5cGhJRF0gPSBudWxsOwogICAgICAgICAgICB9CiAgICAg
ICAgICAgIHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdID0gdW5kZWZpbmVkOwogICAgICAgIH0K
CiAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBbGxDYWNoZUVudHJpZXMoKSB7CiAgICAgICAgICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgdW5pY29kZXMyR2x5cGhzLmxlbmd0aDsgaSsrKSB7CiAgICAg
ICAgICAgICAgICBjbGVhckNhY2hlRW50cnkoaSk7CiAgICAgICAgICAgIH0KICAgICAgICB9Cgog
ICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEdseXBoIGdseXBoKSB7CiAgICAgICAgICAgIHVu
aWNvZGVzMkdseXBoc1tnbHlwaC5nZXRVbmljb2RlSUQoKV0gPSBnbHlwaC5nZXRHbHlwaENvZGUo
KTsKICAgICAgICAgICAgZ2x5cGhDYWNoZVtnbHlwaC5nZXRHbHlwaENvZGUoKV0gPSBnbHlwaDsK
ICAgICAgICB9CgogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRHbHlwaFBpeGVsV2lkdGgoY2hhciB1
bmljb2RlSUQpIHsKICAgICAgICAgICAgR2x5cGggZ2x5cGggPSBnZXRHbHlwaCh1bmljb2RlSUQp
OwogICAgICAgICAgICBpZiAoZ2x5cGggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJu
IGdseXBoLmdldEFkdmFuY2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSGF2ZSB0
byBkbyB0aGlzIHRoZSBoYXJkIC8gdW5jYWNoZWQgd2F5CiAgICAgICAgICAgIHNpbmdsZVVuaWNv
ZGVbMF0gPSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZm9udC5jcmVh
dGVHbHlwaFZlY3Rvcihmb250UmVuZGVyQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVVbmljb2Rl
KTsKICAgICAgICAgICAgcmV0dXJuIGd2LmdldEdseXBoTWV0cmljcygwKS5nZXRBZHZhbmNlKCk7
CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm5zIGEgZ2x5cGggb2JqZWN0IGZvciB0aGlzIHNp
bmdsZSBnbHlwaC4gUmV0dXJucyBudWxsCiAgICAgICAgLy8gaWYgdGhlIHVuaWNvZGUgb3IgZ2x5
cGggSUQgd291bGQgYmUgb3V0IG9mIGJvdW5kcyBvZiB0aGUKICAgICAgICAvLyBnbHlwaCBjYWNo
ZS4KICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKENoYXJTZXF1ZW5jZSBpblN0cmluZywK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoVmVjdG9yIGZ1bGxSdW5HbHlwaFZl
Y3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgewogICAgICAg
ICAgICBjaGFyIHVuaWNvZGVJRCA9IGluU3RyaW5nLmNoYXJBdChpbmRleCk7CgogICAgICAgICAg
ICBpZiAodW5pY29kZUlEID49IHVuaWNvZGVzMkdseXBocy5sZW5ndGgpIHsKICAgICAgICAgICAg
ICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbnQgZ2x5cGhJRCA9
IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwogICAgICAgICAgICBpZiAoZ2x5cGhJRCAhPSB1
bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnbHlwaENhY2hlW2dseXBoSURdOwog
ICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNdXN0IGZhYnJpY2F0ZSB0aGUgZ2x5cGgKICAg
ICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IHVuaWNvZGVJRDsKICAgICAgICAgICAgR2x5cGhW
ZWN0b3IgZ3YgPSBmb250LmNyZWF0ZUdseXBoVmVjdG9yKGdldEZvbnRSZW5kZXJDb250ZXh0KCks
IHNpbmdsZVVuaWNvZGUpOwogICAgICAgICAgICByZXR1cm4gZ2V0R2x5cGgodW5pY29kZUlELCBn
diwgZnVsbFJ1bkdseXBoVmVjdG9yLmdldEdseXBoTWV0cmljcyhpbmRleCkpOwogICAgICAgIH0K
CiAgICAgICAgLy8gSXQncyB1bmNsZWFyIHdoZXRoZXIgdGhpcyB2YXJpYW50IG1pZ2h0IHByb2R1
Y2UgbGVzcwogICAgICAgIC8vIG9wdGltYWwgcmVzdWx0cyB0aGFuIGlmIHdlIGNhbiBzZWUgdGhl
IGVudGlyZSBHbHlwaFZlY3RvcgogICAgICAgIC8vIGZvciB0aGUgaW5jb21pbmcgc3RyaW5nCiAg
ICAgICAgcHJpdmF0ZSBHbHlwaCBnZXRHbHlwaChpbnQgdW5pY29kZUlEKSB7CiAgICAgICAgICAg
IGlmICh1bmljb2RlSUQgPj0gdW5pY29kZXMyR2x5cGhzLmxlbmd0aCkgewogICAgICAgICAgICAg
ICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBnbHlwaElEID0g
dW5pY29kZXMyR2x5cGhzW3VuaWNvZGVJRF07CiAgICAgICAgICAgIGlmIChnbHlwaElEICE9IHVu
ZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGdseXBoQ2FjaGVbZ2x5cGhJRF07CiAg
ICAgICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IChjaGFyKSB1bmljb2Rl
SUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZm9udC5jcmVhdGVHbHlwaFZlY3Rvcihn
ZXRGb250UmVuZGVyQ29udGV4dCgpLCBzaW5nbGVVbmljb2RlKTsKICAgICAgICAgICAgcmV0dXJu
IGdldEdseXBoKHVuaWNvZGVJRCwgZ3YsIGd2LmdldEdseXBoTWV0cmljcygwKSk7CiAgICAgICAg
fQoKICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKGludCB1bmljb2RlSUQsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBzaW5nbGVVbmljb2RlR2x5cGhWZWN0
b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaE1ldHJpY3MgbWV0cmljcykg
ewogICAgICAgICAgICBpbnQgZ2x5cGhDb2RlID0gc2luZ2xlVW5pY29kZUdseXBoVmVjdG9yLmdl
dEdseXBoQ29kZSgwKTsKICAgICAgICAgICAgLy8gSGF2ZSBzZWVuIGh1Z2UgZ2x5cGggY29kZXMg
KDY1NTM2KSBjb21pbmcgb3V0IG9mIHNvbWUgZm9udHMgaW4gc29tZSBVbmljb2RlIHNpdHVhdGlv
bnMKICAgICAgICAgICAgaWYgKGdseXBoQ29kZSA+PSBnbHlwaENhY2hlLmxlbmd0aCkgewogICAg
ICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgR2x5cGgg
Z2x5cGggPSBuZXcgR2x5cGgodW5pY29kZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBnbHlwaENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1l
dHJpY3MuZ2V0QWR2YW5jZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
aW5nbGVVbmljb2RlR2x5cGhWZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHRoaXMpOwogICAgICAgICAgICByZWdpc3RlcihnbHlwaCk7CiAgICAgICAgICAgIHJldHVy
biBnbHlwaDsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgUGlwZWxpbmVkX1F1YWRSZW5kZXJl
ciB7CiAgICAgICAgaW50IG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgPSAwOwog
ICAgICAgIEZsb2F0QnVmZmVyIG1UZXhDb29yZHM7CiAgICAgICAgRmxvYXRCdWZmZXIgbVZlcnRD
b29yZHM7CiAgICAgICAgYm9vbGVhbiB1c2luZ1ZCT3M7CiAgICAgICAgYm9vbGVhbiBBUkJWQk9B
dmFpbGFibGU7CiAgICAgICAgaW50IG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2VzOwogICAg
ICAgIGludCBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVUZXhDb29yZHM7CgogICAgICAgIFBpcGVsaW5l
ZF9RdWFkUmVuZGVyZXIoKSB7CiAgICAgICAgICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgp
OwogICAgICAgICAgICBtVmVydENvb3JkcyA9IEJ1ZmZlclV0aWwubmV3RmxvYXRCdWZmZXIoa1Rv
dGFsQnVmZmVyU2l6ZUNvb3Jkc1ZlcnRzKTsKICAgICAgICAgICAgbVRleENvb3JkcyA9IEJ1ZmZl
clV0aWwubmV3RmxvYXRCdWZmZXIoa1RvdGFsQnVmZmVyU2l6ZUNvb3Jkc1RleCk7CgogICAgICAg
ICAgICB1c2luZ1ZCT3MgPSBpczE1QXZhaWxhYmxlKGdsKTsKICAgICAgICAgICAgCiAgICAgICAg
ICAgIEFSQlZCT0F2YWlsYWJsZSA9IGdsLmlzRXh0ZW5zaW9uQXZhaWxhYmxlKCJHTF9BUkJfdmVy
dGV4X2J1ZmZlcl9vYmplY3QiKSAmJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wu
aXNGdW5jdGlvbkF2YWlsYWJsZSgiZ2xCaW5kQnVmZmVyQVJCIik7CgogICAgICAgICAgICBpZiAo
dXNpbmdWQk9zKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlu
dFtdIHZib3MgPSBuZXcgaW50WzJdOwogICAgICAgICAgICAgICAgICAgIGdsLmdsR2VuQnVmZmVy
cygyLCBJbnRCdWZmZXIud3JhcCh2Ym9zKSk7CgogICAgICAgICAgICAgICAgICAgIG1WQk9fRm9y
X1Jlc3VhYmxlVGlsZVZlcnRpY2VzID0gdmJvc1swXTsKICAgICAgICAgICAgICAgICAgICBtVkJP
X0Zvcl9SZXN1YWJsZVRpbGVUZXhDb29yZHMgPSB2Ym9zWzFdOwoKICAgICAgICAgICAgICAgICAg
ICBnbC5nbEJpbmRCdWZmZXIoR0wuR0xfQVJSQVlfQlVGRkVSLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVWZXJ0aWNlcyk7CiAgICAgICAg
ICAgICAgICAgICAgZ2wuZ2xCdWZmZXJEYXRhKEdMLkdMX0FSUkFZX0JVRkZFUiwga1RvdGFsQnVm
ZmVyU2l6ZUJ5dGVzVmVydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51
bGwsIEdMLkdMX1NUUkVBTV9EUkFXKTsgLy8gc3RyZWFtIGRyYXcgYmVjYXVzZSB0aGlzIGlzIGEg
c2luZ2xlIHF1YWQgdXNlIHBpcGVsaW5lCgogICAgICAgICAgICAgICAgICAgIGdsLmdsQmluZEJ1
ZmZlcihHTC5HTF9BUlJBWV9CVUZGRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVRleENvb3Jkcyk7CiAgICAgICAgICAgICAgICAgICAg
Z2wuZ2xCdWZmZXJEYXRhKEdMLkdMX0FSUkFZX0JVRkZFUiwga1RvdGFsQnVmZmVyU2l6ZUJ5dGVz
VGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBHTC5HTF9TVFJF
QU1fRFJBVyk7IC8vIHN0cmVhbSBkcmF3IGJlY2F1c2UgdGhpcyBpcyBhIHNpbmdsZSBxdWFkIHVz
ZSBwaXBlbGluZQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAg
ICAgICAgICAgICAgICBpc0V4dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJTSU9OXzFfNSA9IGZhbHNl
OwogICAgICAgICAgICAgICAgICAgIHVzaW5nVkJPcyA9IGZhbHNlOwogICAgICAgICAgICAgICAg
fQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBnbFRleENvb3Jk
MmYoZmxvYXQgdiwgZmxvYXQgdjEpIHsKICAgICAgICAgICAgbVRleENvb3Jkcy5wdXQodik7CiAg
ICAgICAgICAgIG1UZXhDb29yZHMucHV0KHYxKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2
b2lkIGdsVmVydGV4M2YoZmxvYXQgaW5YLCBmbG9hdCBpblksIGZsb2F0IGluWikgewogICAgICAg
ICAgICBtVmVydENvb3Jkcy5wdXQoaW5YKTsKICAgICAgICAgICAgbVZlcnRDb29yZHMucHV0KGlu
WSk7CiAgICAgICAgICAgIG1WZXJ0Q29vcmRzLnB1dChpblopOwoKICAgICAgICAgICAgbU91dHN0
YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSsrOwoKICAgICAgICAgICAgaWYgKG1PdXRzdGFu
ZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgPj0ga1RvdGFsQnVmZmVyU2l6ZVZlcnRzKSB7CiAg
ICAgICAgICAgICAgICB0aGlzLmRyYXcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAg
ICAgcHJpdmF0ZSB2b2lkIGRyYXcoKSB7CiAgICAgICAgICAgIGlmICh1c2VWZXJ0ZXhBcnJheXMp
IHsKICAgICAgICAgICAgICAgIGRyYXdWZXJ0ZXhBcnJheXMoKTsKICAgICAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgICAgIGRyYXdJTU1FRElBVEUoKTsKICAgICAgICAgICAgfQogICAgICAg
IH0KCiAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdWZXJ0ZXhBcnJheXMoKSB7CiAgICAgICAgICAg
IGlmIChtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lID4gMCkgewogICAgICAgICAg
ICAgICAgR0wgZ2wgPSBHTFUuZ2V0Q3VycmVudEdMKCk7CgogICAgICAgICAgICAgICAgVGV4dHVy
ZVJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CiAgICAgICAgICAgICAgICBU
ZXh0dXJlIHRleHR1cmUgPSByZW5kZXJlci5nZXRUZXh0dXJlKCk7IC8vIHRyaWdnZXJzIHRleHR1
cmUgdXBsb2Fkcy4gIE1heWJlIHRoaXMgc2hvdWxkIGJlIG1vcmUgb2J2aW91cz8KCiAgICAgICAg
ICAgICAgICBtVmVydENvb3Jkcy5yZXdpbmQoKTsKICAgICAgICAgICAgICAgIG1UZXhDb29yZHMu
cmV3aW5kKCk7CgogICAgICAgICAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTC5HTF9W
RVJURVhfQVJSQVkpOwoKICAgICAgICAgICAgICAgIGlmICh1c2luZ1ZCT3MpIHsKICAgICAgICAg
ICAgICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wuR0xfQVJSQVlfQlVGRkVSLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVWZXJ0aWNlcyk7
CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCdWZmZXJTdWJEYXRhKEdMLkdMX0FSUkFZX0JVRkZF
UiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHN0YW5kaW5n
R2x5cGhzVmVydGljZXNQaXBlbGluZSAqIGtTaXplSW5CeXRlc19PbmVWZXJ0aWNlc19WZXJ0ZXhE
YXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcyk7
IC8vIHVwbG9hZCBvbmx5IHRoZSBuZXcgc3R1ZmYKICAgICAgICAgICAgICAgICAgICBnbC5nbFZl
cnRleFBvaW50ZXIoMywgR0wuR0xfRkxPQVQsIDAsIDApOwogICAgICAgICAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgICAgICAgICBpZiAoQVJCVkJPQXZhaWxhYmxlKSB7CiAgICAgICAgICAg
ICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJBWV9CVUZGRVIsIDApOwogICAg
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbC5nbFZlcnRleFBvaW50ZXIo
MywgR0wuR0xfRkxPQVQsIDAsIG1WZXJ0Q29vcmRzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAg
ICAgICAgICAgICBnbC5nbEVuYWJsZUNsaWVudFN0YXRlKEdMLkdMX1RFWFRVUkVfQ09PUkRfQVJS
QVkpOwoKICAgICAgICAgICAgICAgIGlmICh1c2luZ1ZCT3MpIHsKICAgICAgICAgICAgICAgICAg
ICBnbC5nbEJpbmRCdWZmZXIoR0wuR0xfQVJSQVlfQlVGRkVSLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVUZXhDb29yZHMpOwogICAgICAg
ICAgICAgICAgICAgIGdsLmdsQnVmZmVyU3ViRGF0YShHTC5HTF9BUlJBWV9CVUZGRVIsIDAsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1Zl
cnRpY2VzUGlwZWxpbmUgKiBrU2l6ZUluQnl0ZXNfT25lVmVydGljZXNfVGV4RGF0YSwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleENvb3Jkcyk7IC8vIHVwbG9hZCBv
bmx5IHRoZSBuZXcgc3R1ZmYKICAgICAgICAgICAgICAgICAgICBnbC5nbFRleENvb3JkUG9pbnRl
cigyLCBHTC5HTF9GTE9BVCwgMCwgMCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAg
ICAgICAgICAgICAgIGlmIChBUkJWQk9BdmFpbGFibGUpIHsKICAgICAgICAgICAgICAgICAgICAg
ICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7CiAgICAgICAgICAgICAg
ICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4Q29vcmRQb2ludGVyKDIsIEdMLkdM
X0ZMT0FULCAwLCBtVGV4Q29vcmRzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAg
ICBnbC5nbERyYXdBcnJheXMoR0wuR0xfUVVBRFMsIDAsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSk7CgogICAgICAgICAg
ICAgICAgbVZlcnRDb29yZHMucmV3aW5kKCk7CiAgICAgICAgICAgICAgICBtVGV4Q29vcmRzLnJl
d2luZCgpOwogICAgICAgICAgICAgICAgbU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGlu
ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCBkcmF3
SU1NRURJQVRFKCkgewogICAgICAgICAgICBpZiAobU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQ
aXBlbGluZSA+IDApIHsKICAgICAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9
IGdldEJhY2tpbmdTdG9yZSgpOwogICAgICAgICAgICAgICAgVGV4dHVyZSB0ZXh0dXJlID0gcmVu
ZGVyZXIuZ2V0VGV4dHVyZSgpOyAvLyB0cmlnZ2VycyB0ZXh0dXJlIHVwbG9hZHMuICBNYXliZSB0
aGlzIHNob3VsZCBiZSBtb3JlIG9idmlvdXM/CgogICAgICAgICAgICAgICAgR0wgZ2wgPSBHTFUu
Z2V0Q3VycmVudEdMKCk7CiAgICAgICAgICAgICAgICBnbC5nbEJlZ2luKEdMLkdMX1FVQURTKTsK
CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJPZlF1
YWRzID0gbU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSAvIDQ7CiAgICAgICAgICAg
ICAgICAgICAgbVZlcnRDb29yZHMucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgbVRleENv
b3Jkcy5yZXdpbmQoKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBu
dW1iZXJPZlF1YWRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29y
ZDJmKG1UZXhDb29yZHMuZ2V0KCksIG1UZXhDb29yZHMuZ2V0KCkpOwogICAgICAgICAgICAgICAg
ICAgICAgICBnbC5nbFZlcnRleDNmKG1WZXJ0Q29vcmRzLmdldCgpLCBtVmVydENvb3Jkcy5nZXQo
KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQo
KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBnbC5nbFRleENvb3JkMmYobVRleENvb3Jkcy5n
ZXQoKSwgbVRleENvb3Jkcy5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVmVy
dGV4M2YobVZlcnRDb29yZHMuZ2V0KCksIG1WZXJ0Q29vcmRzLmdldCgpLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1WZXJ0Q29vcmRzLmdldCgpKTsKCiAgICAgICAgICAg
ICAgICAgICAgICAgIGdsLmdsVGV4Q29vcmQyZihtVGV4Q29vcmRzLmdldCgpLCBtVGV4Q29vcmRz
LmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZ2wuZ2xWZXJ0ZXgzZihtVmVydENvb3Jk
cy5nZXQoKSwgbVZlcnRDb29yZHMuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbVZlcnRDb29yZHMuZ2V0KCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZ2wu
Z2xUZXhDb29yZDJmKG1UZXhDb29yZHMuZ2V0KCksIG1UZXhDb29yZHMuZ2V0KCkpOwogICAgICAg
ICAgICAgICAgICAgICAgICBnbC5nbFZlcnRleDNmKG1WZXJ0Q29vcmRzLmdldCgpLCBtVmVydENv
b3Jkcy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVydENv
b3Jkcy5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRj
aCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgp
OwogICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICBnbC5nbEVu
ZCgpOwogICAgICAgICAgICAgICAgICAgIG1WZXJ0Q29vcmRzLnJld2luZCgpOwogICAgICAgICAg
ICAgICAgICAgIG1UZXhDb29yZHMucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgbU91dHN0
YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAg
ICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgRGVidWdMaXN0ZW5lciBpbXBsZW1l
bnRzIEdMRXZlbnRMaXN0ZW5lciB7CiAgICAgICAgcHJpdmF0ZSBHTFUgZ2x1ID0gbmV3IEdMVSgp
OwogICAgICAgIHByaXZhdGUgRnJhbWUgZnJhbWU7CgogICAgICAgIERlYnVnTGlzdGVuZXIoRnJh
bWUgZnJhbWUpIHsKICAgICAgICAgICAgdGhpcy5mcmFtZSA9IGZyYW1lOwogICAgICAgIH0KCiAg
ICAgICAgcHVibGljIHZvaWQgZGlzcGxheShHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSkgewogICAg
ICAgICAgICBHTCBnbCA9IGRyYXdhYmxlLmdldEdMKCk7CiAgICAgICAgICAgIGdsLmdsQ2xlYXIo
R0wuR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwoKICAgICAg
ICAgICAgaWYgKHBhY2tlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgICAgIH0KCiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kID0gZ2V0QmFja2luZ1N0
b3JlKCk7CiAgICAgICAgICAgIGZpbmFsIGludCB3ID0gcmVuZC5nZXRXaWR0aCgpOwogICAgICAg
ICAgICBmaW5hbCBpbnQgaCA9IHJlbmQuZ2V0SGVpZ2h0KCk7CiAgICAgICAgICAgIHJlbmQuYmVn
aW5PcnRob1JlbmRlcmluZyh3LCBoKTsKICAgICAgICAgICAgcmVuZC5kcmF3T3J0aG9SZWN0KDAs
IDApOwogICAgICAgICAgICByZW5kLmVuZE9ydGhvUmVuZGVyaW5nKCk7CgogICAgICAgICAgICBp
ZiAoKGZyYW1lLmdldFdpZHRoKCkgIT0gdykgfHwgKGZyYW1lLmdldEhlaWdodCgpICE9IGgpKSB7
CiAgICAgICAgICAgICAgICBFdmVudFF1ZXVlLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsK
ICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZnJhbWUuc2V0U2l6ZSh3LCBoKTsKICAgICAgICAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAg
ICAgICAvLyBVbnVzZWQgbWV0aG9kcwogICAgICAgIHB1YmxpYyB2b2lkIGluaXQoR0xBdXRvRHJh
d2FibGUgZHJhd2FibGUpIHsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHJlc2hhcGUo
R0xBdXRvRHJhd2FibGUgZHJhd2FibGUsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgewogICAgICAgIH0KCiAgICAgICAgcHVi
bGljIHZvaWQgZGlzcGxheUNoYW5nZWQoR0xBdXRvRHJhd2FibGUgZHJhd2FibGUsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtb2RlQ2hhbmdlZCwgYm9vbGVhbiBk
ZXZpY2VDaGFuZ2VkKSB7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2V0cyB3aGV0
aGVyIHZlcnRleCBhcnJheXMgYXJlIGJlaW5nIHVzZWQgaW50ZXJuYWxseSBmb3IKICAgICAqIHJl
bmRlcmluZywgb3Igd2hldGhlciB0ZXh0IGlzIHJlbmRlcmVkIHVzaW5nIHRoZSBPcGVuR0wKICAg
ICAqIGltbWVkaWF0ZSBtb2RlIGNvbW1hbmRzLiBUaGlzIGlzIHByb3ZpZGVkIGFzIGEgY29uY2Vz
c2lvbiBmb3IKICAgICAqIGNlcnRhaW4gZ3JhcGhpY3MgY2FyZHMgd2hpY2ggaGF2ZSBwb29yIHZl
cnRleCBhcnJheQogICAgICogcGVyZm9ybWFuY2UuIERlZmF1bHRzIHRvIHRydWUuCiAgICAgKi8K
ICAgIHB1YmxpYyB2b2lkIHNldFVzZVZlcnRleEFycmF5cyhib29sZWFuIHVzZVZlcnRleEFycmF5
cykgewogICAgICAgIHRoaXMudXNlVmVydGV4QXJyYXlzID0gdXNlVmVydGV4QXJyYXlzOwogICAg
fQoKICAgIC8qKgogICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdmVydGV4IGFycmF5cyBhcmUgYmVp
bmcgdXNlZCBpbnRlcm5hbGx5IGZvcgogICAgICogcmVuZGVyaW5nLCBvciB3aGV0aGVyIHRleHQg
aXMgcmVuZGVyZWQgdXNpbmcgdGhlIE9wZW5HTAogICAgICogaW1tZWRpYXRlIG1vZGUgY29tbWFu
ZHMuIERlZmF1bHRzIHRvIHRydWUuCiAgICAgKi8KICAgIHB1YmxpYyBib29sZWFuIGdldFVzZVZl
cnRleEFycmF5cygpIHsKICAgICAgICByZXR1cm4gdXNlVmVydGV4QXJyYXlzOwogICAgfQoKICAg
IC8qKgogICAgICogU2V0cyB3aGV0aGVyIHNtb290aGluZyAoaS5lLiwgR0xfTElORUFSIGZpbHRl
cmluZykgaXMgZW5hYmxlZAogICAgICogaW4gdGhlIGJhY2tpbmcgVGV4dHVyZVJlbmRlcmVyIG9m
IHRoaXMgVGV4dFJlbmRlcmVyLiBBIGZldwogICAgICogZ3JhcGhpY3MgY2FyZHMgZG8gbm90IGJl
aGF2ZSB3ZWxsIHdoZW4gdGhpcyBpcyBlbmFibGVkLAogICAgICogcmVzdWx0aW5nIGluIGZ1enp5
IHRleHQuIERlZmF1bHRzIHRvIHRydWUuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHNldFNtb290
aGluZyhib29sZWFuIHNtb290aGluZykgewogICAgICAgIHRoaXMuc21vb3RoaW5nID0gc21vb3Ro
aW5nOwogICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLnNldFNtb290aGluZyhzbW9vdGhpbmcpOwog
ICAgfQoKICAgIC8qKgogICAgICogSW5kaWNhdGVzIHdoZXRoZXIgc21vb3RoaW5nIGlzIGVuYWJs
ZWQgaW4gdGhlIGJhY2tpbmcKICAgICAqIFRleHR1cmVSZW5kZXJlciBvZiB0aGlzIFRleHRSZW5k
ZXJlci4gQSBmZXcgZ3JhcGhpY3MgY2FyZHMgZG8KICAgICAqIG5vdCBiZWhhdmUgd2VsbCB3aGVu
IHRoaXMgaXMgZW5hYmxlZCwgcmVzdWx0aW5nIGluIGZ1enp5IHRleHQuCiAgICAgKiBEZWZhdWx0
cyB0byB0cnVlLgogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiBnZXRTbW9vdGhpbmcoKSB7CiAg
ICAgICAgcmV0dXJuIHNtb290aGluZzsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gaXMxNUF2
YWlsYWJsZShHTCBnbCkgewogICAgICAgIGlmICghY2hlY2tGb3JfaXNFeHRlbnNpb25BdmFpbGFi
bGVfR0xfVkVSU0lPTl8xXzUpIHsKICAgICAgICAgICAgaXNFeHRlbnNpb25BdmFpbGFibGVfR0xf
VkVSU0lPTl8xXzUgPSBnbC5pc0V4dGVuc2lvbkF2YWlsYWJsZSgiR0xfVkVSU0lPTl8xXzUiKTsK
ICAgICAgICAgICAgY2hlY2tGb3JfaXNFeHRlbnNpb25BdmFpbGFibGVfR0xfVkVSU0lPTl8xXzUg
PSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaXNFeHRlbnNpb25BdmFpbGFibGVfR0xf
VkVSU0lPTl8xXzU7CiAgICB9Cn0KCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>133</attachid>
            <date>2008-08-19 14:18:00 +0200</date>
            <delta_ts>2008-08-19 14:18:00 +0200</delta_ts>
            <desc>Fix handling the crash with Intel chips and working with OpenGL 1.4 too</desc>
            <filename>TextRenderer.java</filename>
            <type>text/plain</type>
            <size>79827</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChjKSAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKICogbWV0OgogKgog
KiAtIFJlZGlzdHJpYnV0aW9uIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIC0gUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgogKgogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIElu
Yy4gb3IgdGhlIG5hbWVzIG9mCiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRoaXMgc29mdHdhcmUg
aXMgcHJvdmlkZWQgIkFTIElTLCIgd2l0aG91dCBhIHdhcnJhbnR5IG9mIGFueSBraW5kLiBBTEwK
ICogRVhQUkVTUyBPUiBJTVBMSUVEIENPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FS
UkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJ
TElUWSwgRklUTkVTUyBGT1IgQQogKiBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdF
TUVOVCwgQVJFIEhFUkVCWSBFWENMVURFRC4gU1VOCiAqIE1JQ1JPU1lTVEVNUywgSU5DLiAoIlNV
TiIpIEFORCBJVFMgTElDRU5TT1JTIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SCiAqIEFOWSBEQU1B
R0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIFVTSU5HLCBNT0RJRllJTkcg
T1IKICogRElTVFJJQlVUSU5HIFRISVMgU09GVFdBUkUgT1IgSVRTIERFUklWQVRJVkVTLiBJTiBO
TyBFVkVOVCBXSUxMIFNVTiBPUgogKiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIExP
U1QgUkVWRU5VRSwgUFJPRklUIE9SIERBVEEsIE9SIEZPUgogKiBESVJFQ1QsIElORElSRUNULCBT
UEVDSUFMLCBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMIE9SIFBVTklUSVZFCiAqIERBTUFHRVMs
IEhPV0VWRVIgQ0FVU0VEIEFORCBSRUdBUkRMRVNTIE9GIFRIRSBUSEVPUlkgT0YgTElBQklMSVRZ
LAogKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRgogKiBTVU4gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0VTLgogKgogKiBZb3UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIHNvZnR3
YXJlIGlzIG5vdCBkZXNpZ25lZCBvciBpbnRlbmRlZCBmb3IgdXNlCiAqIGluIHRoZSBkZXNpZ24s
IGNvbnN0cnVjdGlvbiwgb3BlcmF0aW9uIG9yIG1haW50ZW5hbmNlIG9mIGFueSBudWNsZWFyCiAq
IGZhY2lsaXR5LgogKgogKiBTdW4gZ3JhdGVmdWxseSBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIHNv
ZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGF1dGhvcmVkCiAqIGFuZCBkZXZlbG9wZWQgYnkgS2VubmV0
aCBCcmFkbGV5IFJ1c3NlbGwgYW5kIENocmlzdG9waGVyIEpvaG4gS2xpbmUuCiAqLwpwYWNrYWdl
IGNvbS5zdW4ub3BlbmdsLnV0aWwuajJkOwoKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwuKjsK
aW1wb3J0IGNvbS5zdW4ub3BlbmdsLmltcGwucGFja3JlY3QuKjsKaW1wb3J0IGNvbS5zdW4ub3Bl
bmdsLnV0aWwuKjsKaW1wb3J0IGNvbS5zdW4ub3BlbmdsLnV0aWwudGV4dHVyZS4qOwoKaW1wb3J0
IGphdmEuYXd0LkFscGhhQ29tcG9zaXRlOwppbXBvcnQgamF2YS5hd3QuQ29sb3I7CmltcG9ydCBq
YXZhLmF3dC5Db21wb3NpdGU7CgovLyBGb3IgZGVidWdnaW5nIHB1cnBvc2VzCmltcG9ydCBqYXZh
LmF3dC5FdmVudFF1ZXVlOwppbXBvcnQgamF2YS5hd3QuRm9udDsKaW1wb3J0IGphdmEuYXd0LkZy
YW1lOwppbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKaW1wb3J0IGphdmEuYXd0LkltYWdlOwpp
bXBvcnQgamF2YS5hd3QuUG9pbnQ7CmltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKaW1w
b3J0IGphdmEuYXd0LmV2ZW50Lio7CmltcG9ydCBqYXZhLmF3dC5mb250Lio7CmltcG9ydCBqYXZh
LmF3dC5nZW9tLio7CgppbXBvcnQgamF2YS5uaW8uKjsKCmltcG9ydCBqYXZhLnRleHQuKjsKCmlt
cG9ydCBqYXZhLnV0aWwuKjsKCmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuKjsKaW1wb3J0IGph
dmF4Lm1lZGlhLm9wZW5nbC5nbHUuKjsKCgovKiogUmVuZGVycyBiaXRtYXBwZWQgSmF2YSAyRCB0
ZXh0IGludG8gYW4gT3BlbkdMIHdpbmRvdyB3aXRoIGhpZ2gKICAgIHBlcmZvcm1hbmNlLCBmdWxs
IFVuaWNvZGUgc3VwcG9ydCwgYW5kIGEgc2ltcGxlIEFQSS4gUGVyZm9ybXMKICAgIGFwcHJvcHJp
YXRlIGNhY2hpbmcgb2YgdGV4dCByZW5kZXJpbmcgcmVzdWx0cyBpbiBhbiBPcGVuR0wgdGV4dHVy
ZQogICAgaW50ZXJuYWxseSB0byBhdm9pZCByZXBlYXRlZCBmb250IHJhc3Rlcml6YXRpb24uIFRo
ZSBjYWNoaW5nIGlzCiAgICBjb21wbGV0ZWx5IGF1dG9tYXRpYywgZG9lcyBub3QgcmVxdWlyZSBh
bnkgdXNlciBpbnRlcnZlbnRpb24sIGFuZAogICAgaGFzIG5vIHZpc2libGUgY29udHJvbHMgaW4g
dGhlIHB1YmxpYyBBUEkuIDxQPgoKICAgIFVzaW5nIHRoZSB7QGxpbmsgVGV4dFJlbmRlcmVyIFRl
eHRSZW5kZXJlcn0gaXMgc2ltcGxlLiBBZGQgYQogICAgIjxjb2RlPlRleHRSZW5kZXJlciByZW5k
ZXJlcjs8L2NvZGU+IiBmaWVsZCB0byB5b3VyIHtAbGluawogICAgamF2YXgubWVkaWEub3Blbmds
LkdMRXZlbnRMaXN0ZW5lciBHTEV2ZW50TGlzdGVuZXJ9LiBJbiB5b3VyIHtAbGluawogICAgamF2
YXgubWVkaWEub3BlbmdsLkdMRXZlbnRMaXN0ZW5lciNpbml0IGluaXR9IG1ldGhvZCwgYWRkOgoK
ICAgIDxQUkU+CiAgICByZW5kZXJlciA9IG5ldyBUZXh0UmVuZGVyZXIobmV3IEZvbnQoIlNhbnNT
ZXJpZiIsIEZvbnQuQk9MRCwgMzYpKTsKICAgIDwvUFJFPgoKICAgIDxQPiBJbiB0aGUge0BsaW5r
IGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIjZGlzcGxheSBkaXNwbGF5fSBtZXRo
b2Qgb2YgeW91cgogICAge0BsaW5rIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIg
R0xFdmVudExpc3RlbmVyfSwgYWRkOgogICAgPFBSRT4KICAgIHJlbmRlcmVyLmJlZ2luUmVuZGVy
aW5nKGRyYXdhYmxlLmdldFdpZHRoKCksIGRyYXdhYmxlLmdldEhlaWdodCgpKTsKICAgIC8vIG9w
dGlvbmFsbHkgc2V0IHRoZSBjb2xvcgogICAgcmVuZGVyZXIuc2V0Q29sb3IoMS4wZiwgMC4yZiwg
MC4yZiwgMC44Zik7CiAgICByZW5kZXJlci5kcmF3KCJUZXh0IHRvIGRyYXciLCB4UG9zaXRpb24s
IHlQb3NpdGlvbik7CiAgICAvLyAuLi4gbW9yZSBkcmF3IGNvbW1hbmRzLCBjb2xvciBjaGFuZ2Vz
LCBldGMuCiAgICByZW5kZXJlci5lbmRSZW5kZXJpbmcoKTsKICAgIDwvUFJFPgoKICAgIFVubGVz
cyB5b3UgYXJlIHNoYXJpbmcgdGV4dHVyZXMgYW5kIGRpc3BsYXkgbGlzdHMgYmV0d2VlbiBPcGVu
R0wKICAgIGNvbnRleHRzLCB5b3UgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGUge0BsaW5rICNkaXNw
b3NlIGRpc3Bvc2V9CiAgICBtZXRob2Qgb2YgdGhlIFRleHRSZW5kZXJlcjsgdGhlIE9wZW5HTCBy
ZXNvdXJjZXMgaXQgdXNlcwogICAgaW50ZXJuYWxseSB3aWxsIGJlIGNsZWFuZWQgdXAgYXV0b21h
dGljYWxseSB3aGVuIHRoZSBPcGVuR0wKICAgIGNvbnRleHQgaXMgZGVzdHJveWVkLiA8UD4KCiAg
ICA8Yj5Ob3RlPC9iPiB0aGF0IHRoZSBUZXh0UmVuZGVyZXIgbWF5IGNhdXNlIHRoZSB2ZXJ0ZXgg
YW5kIHRleHR1cmUKICAgIGNvb3JkaW5hdGUgYXJyYXkgYnVmZmVyIGJpbmRpbmdzIHRvIGNoYW5n
ZSwgb3IgdG8gYmUgdW5ib3VuZC4gVGhpcwogICAgaXMgaW1wb3J0YW50IHRvIG5vdGUgaWYgeW91
IGFyZSB1c2luZyBWZXJ0ZXggQnVmZmVyIE9iamVjdHMgKFZCT3MpCiAgICBpbiB5b3VyIGFwcGxp
Y2F0aW9uLiA8UD4KCiAgICBJbnRlcm5hbGx5LCB0aGUgcmVuZGVyZXIgdXNlcyBhIHJlY3Rhbmds
ZSBwYWNraW5nIGFsZ29yaXRobSB0bwogICAgcGFjayBib3RoIGdseXBocyBhbmQgZnVsbCBTdHJp
bmdzJyByZW5kZXJpbmcgcmVzdWx0cyAod2hpY2ggYXJlCiAgICB2YXJpYWJsZSBzaXplKSBvbnRv
IGEgbGFyZ2VyIE9wZW5HTCB0ZXh0dXJlLiBUaGUgaW50ZXJuYWwgYmFja2luZwogICAgc3RvcmUg
aXMgbWFpbnRhaW5lZCB1c2luZyBhIHtAbGluawogICAgY29tLnN1bi5vcGVuZ2wudXRpbC5qMmQu
VGV4dHVyZVJlbmRlcmVyIFRleHR1cmVSZW5kZXJlcn0uIEEgbGVhc3QKICAgIHJlY2VudGx5IHVz
ZWQgKExSVSkgYWxnb3JpdGhtIGlzIHVzZWQgdG8gZGlzY2FyZCBwcmV2aW91c2x5CiAgICByZW5k
ZXJlZCBzdHJpbmdzOyB0aGUgc3BlY2lmaWMgYWxnb3JpdGhtIGlzIHVuZGVmaW5lZCwgYnV0IGlz
CiAgICBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYnkgZmx1c2hpbmcgdW51c2VkIFN0cmluZ3MnIHJl
bmRlcmluZwogICAgcmVzdWx0cyBldmVyeSBmZXcgaHVuZHJlZCByZW5kZXJpbmcgY3ljbGVzLCB3
aGVyZSBhIHJlbmRlcmluZwogICAgY3ljbGUgaXMgZGVmaW5lZCBhcyBhIHBhaXIgb2YgY2FsbHMg
dG8ge0BsaW5rICNiZWdpblJlbmRlcmluZwogICAgYmVnaW5SZW5kZXJpbmd9IC8ge0BsaW5rICNl
bmRSZW5kZXJpbmcgZW5kUmVuZGVyaW5nfS4KCiAgICBAYXV0aG9yIEpvaG4gQnVya2V5CiAgICBA
YXV0aG9yIEtlbm5ldGggUnVzc2VsbAoqLwpwdWJsaWMgY2xhc3MgVGV4dFJlbmRlcmVyIHsKICAg
IHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEZWJ1Zy5kZWJ1ZygiVGV4dFJl
bmRlcmVyIik7CgogICAgLy8gVGhlc2UgYXJlIG9jY2FzaW9uYWxseSB1c2VmdWwgZm9yIG1vcmUg
aW4tZGVwdGggZGVidWdnaW5nCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU0FC
TEVfR0xZUEhfQ0FDSEUgPSBmYWxzZTsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4g
RFJBV19CQk9YRVMgPSBmYWxzZTsKCiAgICBzdGF0aWMgZmluYWwgaW50IGtTaXplID0gMjU2OwoK
ICAgIC8vIEV2ZXJ5IGNlcnRhaW4gbnVtYmVyIG9mIHJlbmRlciBjeWNsZXMsIGZsdXNoIHRoZSBz
dHJpbmdzIHdoaWNoCiAgICAvLyBoYXZlbid0IGJlZW4gdXNlZCByZWNlbnRseQogICAgcHJpdmF0
ZSBzdGF0aWMgZmluYWwgaW50IENZQ0xFU19QRVJfRkxVU0ggPSAxMDA7CgogICAgLy8gVGhlIGFt
b3VudCBvZiB2ZXJ0aWNhbCBkZWFkIHNwYWNlIG9uIHRoZSBiYWNraW5nIHN0b3JlIGJlZm9yZSB3
ZQogICAgLy8gZm9yY2UgYSBjb21wYWN0aW9uCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9h
dCBNQVhfVkVSVElDQUxfRlJBR01FTlRBVElPTiA9IDAuN2Y7CiAgICBzdGF0aWMgZmluYWwgaW50
IGtRdWFkc1BlckJ1ZmZlciA9IDEwMDsKICAgIHN0YXRpYyBmaW5hbCBpbnQga0Nvb3Jkc1BlclZl
cnRWZXJ0cyA9IDM7CiAgICBzdGF0aWMgZmluYWwgaW50IGtDb29yZHNQZXJWZXJ0VGV4ID0gMjsK
ICAgIHN0YXRpYyBmaW5hbCBpbnQga1ZlcnRzUGVyUXVhZCA9IDQ7CiAgICBzdGF0aWMgZmluYWwg
aW50IGtUb3RhbEJ1ZmZlclNpemVWZXJ0cyA9IGtRdWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1
YWQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNWZXJ0cyA9IGtR
dWFkc1BlckJ1ZmZlciAqIGtWZXJ0c1BlclF1YWQgKiBrQ29vcmRzUGVyVmVydFZlcnRzOwogICAg
c3RhdGljIGZpbmFsIGludCBrVG90YWxCdWZmZXJTaXplQ29vcmRzVGV4ID0ga1F1YWRzUGVyQnVm
ZmVyICoga1ZlcnRzUGVyUXVhZCAqIGtDb29yZHNQZXJWZXJ0VGV4OwogICAgc3RhdGljIGZpbmFs
IGludCBrVG90YWxCdWZmZXJTaXplQnl0ZXNWZXJ0cyA9IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNW
ZXJ0cyAqIDQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVCeXRlc1RleCA9
IGtUb3RhbEJ1ZmZlclNpemVDb29yZHNUZXggKiA0OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6
ZUluQnl0ZXNfT25lVmVydGljZXNfVmVydGV4RGF0YSA9IGtDb29yZHNQZXJWZXJ0VmVydHMgKiA0
OwogICAgc3RhdGljIGZpbmFsIGludCBrU2l6ZUluQnl0ZXNfT25lVmVydGljZXNfVGV4RGF0YSA9
IGtDb29yZHNQZXJWZXJ0VGV4ICogNDsKICAgIHByaXZhdGUgRm9udCBmb250OwogICAgcHJpdmF0
ZSBib29sZWFuIGFudGlhbGlhc2VkOwogICAgcHJpdmF0ZSBib29sZWFuIHVzZUZyYWN0aW9uYWxN
ZXRyaWNzOwoKICAgIC8vIFdoZXRoZXIgd2UncmUgYXR0ZW1wdGluZyB0byB1c2UgYXV0b21hdGlj
IG1pcG1hcCBnZW5lcmF0aW9uIHN1cHBvcnQKICAgIHByaXZhdGUgYm9vbGVhbiBtaXBtYXA7CiAg
ICBwcml2YXRlIFJlY3RhbmdsZVBhY2tlciBwYWNrZXI7CiAgICBwcml2YXRlIGJvb2xlYW4gaGF2
ZU1heFNpemU7CiAgICBwcml2YXRlIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlOwogICAg
cHJpdmF0ZSBUZXh0dXJlUmVuZGVyZXIgY2FjaGVkQmFja2luZ1N0b3JlOwogICAgcHJpdmF0ZSBH
cmFwaGljczJEIGNhY2hlZEdyYXBoaWNzOwogICAgcHJpdmF0ZSBGb250UmVuZGVyQ29udGV4dCBj
YWNoZWRGb250UmVuZGVyQ29udGV4dDsKICAgIHByaXZhdGUgTWFwIC8qPFN0cmluZyxSZWN0Piov
IHN0cmluZ0xvY2F0aW9ucyA9IG5ldyBIYXNoTWFwIC8qPFN0cmluZyxSZWN0PiovKCk7CiAgICBw
cml2YXRlIEdseXBoUHJvZHVjZXIgbUdseXBoUHJvZHVjZXI7CgogICAgcHJpdmF0ZSBpbnQgbnVt
UmVuZGVyQ3ljbGVzOwoKICAgIC8vIE5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3Jl
IGluIGEgYmVnaW5SZW5kZXJpbmcoKSAvCiAgICAvLyBlbmRSZW5kZXJpbmcoKSBjeWNsZSBzbyB3
ZSBjYW4gcmUtZW50ZXIgdGhlIGV4YWN0IHNhbWUgc3RhdGUgaWYKICAgIC8vIHdlIGhhdmUgdG8g
cmVhbGxvY2F0ZSB0aGUgYmFja2luZyBzdG9yZQogICAgcHJpdmF0ZSBib29sZWFuIGluQmVnaW5F
bmRQYWlyOwogICAgcHJpdmF0ZSBib29sZWFuIGlzT3J0aG9Nb2RlOwogICAgcHJpdmF0ZSBpbnQg
YmVnaW5SZW5kZXJpbmdXaWR0aDsKICAgIHByaXZhdGUgaW50IGJlZ2luUmVuZGVyaW5nSGVpZ2h0
OwogICAgcHJpdmF0ZSBib29sZWFuIGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQ7Cgog
ICAgLy8gRm9yIHJlc2V0dGluZyB0aGUgY29sb3IgYWZ0ZXIgZGlzcG9zYWwgb2YgdGhlIG9sZCBi
YWNraW5nIHN0b3JlCiAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUNhY2hlZENvbG9yOwogICAgcHJp
dmF0ZSBmbG9hdCBjYWNoZWRSOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRHOwogICAgcHJpdmF0
ZSBmbG9hdCBjYWNoZWRCOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRBOwogICAgcHJpdmF0ZSBD
b2xvciBjYWNoZWRDb2xvcjsKICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9SZXNldENvbG9yOwoK
ICAgIC8vIEZvciBkZWJ1Z2dpbmcgb25seQogICAgcHJpdmF0ZSBGcmFtZSBkYmdGcmFtZTsKCiAg
ICAvLyBEZWJ1Z2dpbmcgcHVycG9zZXMgb25seQogICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnZ2Vk
OwogICAgUGlwZWxpbmVkX1F1YWRSZW5kZXJlciBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyOwogICAg
CiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcKICAgIHByaXZhdGUgYm9vbGVhbiB1c2VW
ZXJ0ZXhBcnJheXMgPSB0cnVlOwogICAgCiAgICAvL2VtemljOiBhZGRlZCBib29sZWFuIGZsYWcK
ICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJTSU9OXzFfNTsK
ICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0Zvcl9pc0V4dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJT
SU9OXzFfNTsKCiAgICAvLyBXaGV0aGVyIEdMX0xJTkVBUiBmaWx0ZXJpbmcgaXMgZW5hYmxlZCBm
b3IgdGhlIGJhY2tpbmcgc3RvcmUKICAgIHByaXZhdGUgYm9vbGVhbiBzbW9vdGhpbmcgPSB0cnVl
OwoKICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRSZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBmb250
LCB1c2luZyBubwogICAgICAgIGFudGlhbGlhc2luZyBvciBmcmFjdGlvbmFsIG1ldHJpY3MsIGFu
ZCB0aGUgZGVmYXVsdAogICAgICAgIFJlbmRlckRlbGVnYXRlLiBFcXVpdmFsZW50IHRvIDxjb2Rl
PlRleHRSZW5kZXJlcihmb250LCBmYWxzZSwKICAgICAgICBmYWxzZSk8L2NvZGU+LgoKICAgICAg
ICBAcGFyYW0gZm9udCB0aGUgZm9udCB0byByZW5kZXIgd2l0aAogICAgKi8KICAgIHB1YmxpYyBU
ZXh0UmVuZGVyZXIoRm9udCBmb250KSB7CiAgICAgICAgdGhpcyhmb250LCBmYWxzZSwgZmFsc2Us
IG51bGwsIGZhbHNlKTsKICAgIH0KCiAgICAvKiogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIg
d2l0aCB0aGUgZ2l2ZW4gZm9udCwgdXNpbmcgbm8KICAgICAgICBhbnRpYWxpYXNpbmcgb3IgZnJh
Y3Rpb25hbCBtZXRyaWNzLCBhbmQgdGhlIGRlZmF1bHQKICAgICAgICBSZW5kZXJEZWxlZ2F0ZS4g
SWYgPENPREU+bWlwbWFwPC9DT0RFPiBpcyB0cnVlLCBhdHRlbXB0cyB0byB1c2UKICAgICAgICBP
cGVuR0wncyBhdXRvbWF0aWMgbWlwbWFwIGdlbmVyYXRpb24gZm9yIGJldHRlciBzbW9vdGhpbmcg
d2hlbgogICAgICAgIHJlbmRlcmluZyB0aGUgVGV4dHVyZVJlbmRlcmVyJ3MgY29udGVudHMgYXQg
YSBkaXN0YW5jZS4KICAgICAgICBFcXVpdmFsZW50IHRvIDxjb2RlPlRleHRSZW5kZXJlcihmb250
LCBmYWxzZSwgZmFsc2UpPC9jb2RlPi4KCiAgICAgICAgQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8g
cmVuZGVyIHdpdGgKICAgICAgICBAcGFyYW0gbWlwbWFwIHdoZXRoZXIgdG8gYXR0ZW1wdCB1c2Ug
b2YgYXV0b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uCiAgICAqLwogICAgcHVibGljIFRleHRSZW5k
ZXJlcihGb250IGZvbnQsIGJvb2xlYW4gbWlwbWFwKSB7CiAgICAgICAgdGhpcyhmb250LCBmYWxz
ZSwgZmFsc2UsIG51bGwsIG1pcG1hcCk7CiAgICB9CgogICAgLyoqIENyZWF0ZXMgYSBuZXcgVGV4
dFJlbmRlcmVyIHdpdGggdGhlIGdpdmVuIEZvbnQsIHNwZWNpZmllZCBmb250CiAgICAgICAgcHJv
cGVydGllcywgYW5kIGRlZmF1bHQgUmVuZGVyRGVsZWdhdGUuIFRoZQogICAgICAgIDxjb2RlPmFu
dGlhbGlhc2VkPC9jb2RlPiBhbmQgPGNvZGU+dXNlRnJhY3Rpb25hbE1ldHJpY3M8L2NvZGU+CiAg
ICAgICAgZmxhZ3MgcHJvdmlkZSBjb250cm9sIG92ZXIgdGhlIHNhbWUgcHJvcGVydGllcyBhdCB0
aGUgSmF2YSAyRAogICAgICAgIGxldmVsLiBObyBtaXBtYXAgc3VwcG9ydCBpcyByZXF1ZXN0ZWQu
IEVxdWl2YWxlbnQgdG8KICAgICAgICA8Y29kZT5UZXh0UmVuZGVyZXIoZm9udCwgYW50aWFsaWFz
ZWQsIHVzZUZyYWN0aW9uYWxNZXRyaWNzLAogICAgICAgIG51bGwpPC9jb2RlPi4KCiAgICAgICAg
QHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gcmVuZGVyIHdpdGgKICAgICAgICBAcGFyYW0gYW50aWFs
aWFzZWQgd2hldGhlciB0byB1c2UgYW50aWFsaWFzZWQgZm9udHMKICAgICAgICBAcGFyYW0gdXNl
RnJhY3Rpb25hbE1ldHJpY3Mgd2hldGhlciB0byB1c2UgZnJhY3Rpb25hbCBmb250CiAgICAgICAg
bWV0cmljcyBhdCB0aGUgSmF2YSAyRCBsZXZlbAogICAgKi8KICAgIHB1YmxpYyBUZXh0UmVuZGVy
ZXIoRm9udCBmb250LCBib29sZWFuIGFudGlhbGlhc2VkLAogICAgICAgICAgICAgICAgICAgICAg
ICBib29sZWFuIHVzZUZyYWN0aW9uYWxNZXRyaWNzKSB7CiAgICAgICAgdGhpcyhmb250LCBhbnRp
YWxpYXNlZCwgdXNlRnJhY3Rpb25hbE1ldHJpY3MsIG51bGwsIGZhbHNlKTsKICAgIH0KCiAgICAv
KiogQ3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gRm9udCwgc3BlY2lm
aWVkIGZvbnQKICAgICAgICBwcm9wZXJ0aWVzLCBhbmQgZ2l2ZW4gUmVuZGVyRGVsZWdhdGUuIFRo
ZQogICAgICAgIDxjb2RlPmFudGlhbGlhc2VkPC9jb2RlPiBhbmQgPGNvZGU+dXNlRnJhY3Rpb25h
bE1ldHJpY3M8L2NvZGU+CiAgICAgICAgZmxhZ3MgcHJvdmlkZSBjb250cm9sIG92ZXIgdGhlIHNh
bWUgcHJvcGVydGllcyBhdCB0aGUgSmF2YSAyRAogICAgICAgIGxldmVsLiBUaGUgPGNvZGU+cmVu
ZGVyRGVsZWdhdGU8L2NvZGU+IHByb3ZpZGVzIG1vcmUgY29udHJvbAogICAgICAgIG92ZXIgdGhl
IHRleHQgcmVuZGVyZWQuIE5vIG1pcG1hcCBzdXBwb3J0IGlzIHJlcXVlc3RlZC4KCiAgICAgICAg
QHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gcmVuZGVyIHdpdGgKICAgICAgICBAcGFyYW0gYW50aWFs
aWFzZWQgd2hldGhlciB0byB1c2UgYW50aWFsaWFzZWQgZm9udHMKICAgICAgICBAcGFyYW0gdXNl
RnJhY3Rpb25hbE1ldHJpY3Mgd2hldGhlciB0byB1c2UgZnJhY3Rpb25hbCBmb250CiAgICAgICAg
bWV0cmljcyBhdCB0aGUgSmF2YSAyRCBsZXZlbAogICAgICAgIEBwYXJhbSByZW5kZXJEZWxlZ2F0
ZSB0aGUgcmVuZGVyIGRlbGVnYXRlIHRvIHVzZSB0byBkcmF3IHRoZQogICAgICAgIHRleHQncyBi
aXRtYXAsIG9yIG51bGwgdG8gdXNlIHRoZSBkZWZhdWx0IG9uZQogICAgKi8KICAgIHB1YmxpYyBU
ZXh0UmVuZGVyZXIoRm9udCBmb250LCBib29sZWFuIGFudGlhbGlhc2VkLAogICAgICAgICAgICAg
ICAgICAgICAgICBib29sZWFuIHVzZUZyYWN0aW9uYWxNZXRyaWNzLCBSZW5kZXJEZWxlZ2F0ZSBy
ZW5kZXJEZWxlZ2F0ZSkgewogICAgICAgIHRoaXMoZm9udCwgYW50aWFsaWFzZWQsIHVzZUZyYWN0
aW9uYWxNZXRyaWNzLCByZW5kZXJEZWxlZ2F0ZSwgZmFsc2UpOwogICAgfQoKICAgIC8qKiBDcmVh
dGVzIGEgbmV3IFRleHRSZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBGb250LCBzcGVjaWZpZWQgZm9u
dAogICAgICAgIHByb3BlcnRpZXMsIGFuZCBnaXZlbiBSZW5kZXJEZWxlZ2F0ZS4gVGhlCiAgICAg
ICAgPGNvZGU+YW50aWFsaWFzZWQ8L2NvZGU+IGFuZCA8Y29kZT51c2VGcmFjdGlvbmFsTWV0cmlj
czwvY29kZT4KICAgICAgICBmbGFncyBwcm92aWRlIGNvbnRyb2wgb3ZlciB0aGUgc2FtZSBwcm9w
ZXJ0aWVzIGF0IHRoZSBKYXZhIDJECiAgICAgICAgbGV2ZWwuIFRoZSA8Y29kZT5yZW5kZXJEZWxl
Z2F0ZTwvY29kZT4gcHJvdmlkZXMgbW9yZSBjb250cm9sCiAgICAgICAgb3ZlciB0aGUgdGV4dCBy
ZW5kZXJlZC4gSWYgPENPREU+bWlwbWFwPC9DT0RFPiBpcyB0cnVlLCBhdHRlbXB0cwogICAgICAg
IHRvIHVzZSBPcGVuR0wncyBhdXRvbWF0aWMgbWlwbWFwIGdlbmVyYXRpb24gZm9yIGJldHRlciBz
bW9vdGhpbmcKICAgICAgICB3aGVuIHJlbmRlcmluZyB0aGUgVGV4dHVyZVJlbmRlcmVyJ3MgY29u
dGVudHMgYXQgYSBkaXN0YW5jZS4KCiAgICAgICAgQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gcmVu
ZGVyIHdpdGgKICAgICAgICBAcGFyYW0gYW50aWFsaWFzZWQgd2hldGhlciB0byB1c2UgYW50aWFs
aWFzZWQgZm9udHMKICAgICAgICBAcGFyYW0gdXNlRnJhY3Rpb25hbE1ldHJpY3Mgd2hldGhlciB0
byB1c2UgZnJhY3Rpb25hbCBmb250CiAgICAgICAgbWV0cmljcyBhdCB0aGUgSmF2YSAyRCBsZXZl
bAogICAgICAgIEBwYXJhbSByZW5kZXJEZWxlZ2F0ZSB0aGUgcmVuZGVyIGRlbGVnYXRlIHRvIHVz
ZSB0byBkcmF3IHRoZQogICAgICAgIHRleHQncyBiaXRtYXAsIG9yIG51bGwgdG8gdXNlIHRoZSBk
ZWZhdWx0IG9uZQogICAgICAgIEBwYXJhbSBtaXBtYXAgd2hldGhlciB0byBhdHRlbXB0IHVzZSBv
ZiBhdXRvbWF0aWMgbWlwbWFwIGdlbmVyYXRpb24KICAgICovCiAgICBwdWJsaWMgVGV4dFJlbmRl
cmVyKEZvbnQgZm9udCwgYm9vbGVhbiBhbnRpYWxpYXNlZCwKICAgICAgICAgICAgICAgICAgICAg
ICAgYm9vbGVhbiB1c2VGcmFjdGlvbmFsTWV0cmljcywgUmVuZGVyRGVsZWdhdGUgcmVuZGVyRGVs
ZWdhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWlwbWFwKSB7CiAgICAgICAg
dGhpcy5mb250ID0gZm9udDsKICAgICAgICB0aGlzLmFudGlhbGlhc2VkID0gYW50aWFsaWFzZWQ7
CiAgICAgICAgdGhpcy51c2VGcmFjdGlvbmFsTWV0cmljcyA9IHVzZUZyYWN0aW9uYWxNZXRyaWNz
OwogICAgICAgIHRoaXMubWlwbWFwID0gbWlwbWFwOwoKICAgICAgICAvLyBGSVhNRTogY29uc2lk
ZXIgYWRqdXN0aW5nIHRoZSBzaXplIGJhc2VkIG9uIGZvbnQgc2l6ZQogICAgICAgIC8vIChpdCB3
aWxsIGFscmVhZHkgYXV0b21hdGljYWxseSByZXNpemUgaWYgbmVjZXNzYXJ5KQogICAgICAgIHBh
Y2tlciA9IG5ldyBSZWN0YW5nbGVQYWNrZXIobmV3IE1hbmFnZXIoKSwga1NpemUsIGtTaXplKTsK
CiAgICAgICAgaWYgKHJlbmRlckRlbGVnYXRlID09IG51bGwpIHsKICAgICAgICAgICAgcmVuZGVy
RGVsZWdhdGUgPSBuZXcgRGVmYXVsdFJlbmRlckRlbGVnYXRlKCk7CiAgICAgICAgfQoKICAgICAg
ICB0aGlzLnJlbmRlckRlbGVnYXRlID0gcmVuZGVyRGVsZWdhdGU7CgogICAgICAgIG1HbHlwaFBy
b2R1Y2VyID0gbmV3IEdseXBoUHJvZHVjZXIoZm9udC5nZXROdW1HbHlwaHMoKSk7CiAgICB9Cgog
ICAgLyoqIFJldHVybnMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgZ2l2ZW4gU3RyaW5n
LCBhc3N1bWluZyBpdAogICAgICAgIHdhcyByZW5kZXJlZCBhdCB0aGUgb3JpZ2luLiBTZWUge0Bs
aW5rICNnZXRCb3VuZHMoQ2hhclNlcXVlbmNlKQogICAgICAgIGdldEJvdW5kcyhDaGFyU2VxdWVu
Y2UpfS4gKi8KICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoU3RyaW5nIHN0cikgewog
ICAgICAgIHJldHVybiBnZXRCb3VuZHMoKENoYXJTZXF1ZW5jZSkgc3RyKTsKICAgIH0KCiAgICAv
KiogUmV0dXJucyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBnaXZlbiBDaGFyU2VxdWVu
Y2UsCiAgICAgICAgYXNzdW1pbmcgaXQgd2FzIHJlbmRlcmVkIGF0IHRoZSBvcmlnaW4uIFRoZSBj
b29yZGluYXRlIHN5c3RlbSBvZgogICAgICAgIHRoZSByZXR1cm5lZCByZWN0YW5nbGUgaXMgSmF2
YSAyRCdzLCB3aXRoIGluY3JlYXNpbmcgWQogICAgICAgIGNvb3JkaW5hdGVzIGluIHRoZSBkb3du
d2FyZCBkaXJlY3Rpb24uIFRoZSByZWxhdGl2ZSBjb29yZGluYXRlCiAgICAgICAgKDAsIDApIGlu
IHRoZSByZXR1cm5lZCByZWN0YW5nbGUgY29ycmVzcG9uZHMgdG8gdGhlIGJhc2VsaW5lIG9mCiAg
ICAgICAgdGhlIGxlZnRtb3N0IGNoYXJhY3RlciBvZiB0aGUgcmVuZGVyZWQgc3RyaW5nLCBpbiBz
aW1pbGFyCiAgICAgICAgZmFzaGlvbiB0byB0aGUgcmVzdWx0cyByZXR1cm5lZCBieSwgZm9yIGV4
YW1wbGUsIHtAbGluawogICAgICAgIGphdmEuYXd0LmZvbnQuR2x5cGhWZWN0b3IjZ2V0VmlzdWFs
Qm91bmRzfS4gTW9zdCBhcHBsaWNhdGlvbnMKICAgICAgICB3aWxsIHVzZSBvbmx5IHRoZSB3aWR0
aCBhbmQgaGVpZ2h0IG9mIHRoZSByZXR1cm5lZCBSZWN0YW5nbGUgZm9yCiAgICAgICAgdGhlIHB1
cnBvc2VzIG9mIGNlbnRlcmluZyBvciBqdXN0aWZ5aW5nIHRoZSBTdHJpbmcuIEl0IGlzIG5vdAog
ICAgICAgIHNwZWNpZmllZCB3aGljaCBKYXZhIDJEIGJvdW5kcyAoe0BsaW5rCiAgICAgICAgamF2
YS5hd3QuZm9udC5HbHlwaFZlY3RvciNnZXRWaXN1YWxCb3VuZHMgZ2V0VmlzdWFsQm91bmRzfSwK
ICAgICAgICB7QGxpbmsgamF2YS5hd3QuZm9udC5HbHlwaFZlY3RvciNnZXRQaXhlbEJvdW5kcyBn
ZXRQaXhlbEJvdW5kc30sCiAgICAgICAgZXRjLikgdGhlIHJldHVybmVkIGJvdW5kcyBjb3JyZXNw
b25kIHRvLCBhbHRob3VnaCBldmVyeSBlZmZvcnQKICAgICAgICBpcyBtYWRlIHRvIGVuc3VyZSBh
biBhY2N1cmF0ZSBib3VuZC4gKi8KICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoQ2hh
clNlcXVlbmNlIHN0cikgewogICAgICAgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBtb3JlIG9w
dGltaXplZCBhbmQgdXNlIHRoZSBnbHlwaCBjYWNoZQogICAgICAgIFJlY3QgciA9IG51bGw7Cgog
ICAgICAgIGlmICgociA9IChSZWN0KSBzdHJpbmdMb2NhdGlvbnMuZ2V0KHN0cikpICE9IG51bGwp
IHsKICAgICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgci5nZXRVc2VyRGF0YSgp
OwoKICAgICAgICAgICAgLy8gUmVjb25zdGl0dXRlIHRoZSBKYXZhIDJEIHJlc3VsdHMgYmFzZWQg
b24gdGhlIGNhY2hlZCB2YWx1ZXMKICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5E
b3VibGUoLWRhdGEub3JpZ2luKCkueCwgLWRhdGEub3JpZ2luKCkueSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgci53KCksIHIuaCgpKTsKICAgICAgICB9CgogICAg
ICAgIC8vIE11c3QgcmV0dXJuIGEgUmVjdGFuZ2xlIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF5b3V0
IGFsZ29yaXRobSAtLQogICAgICAgIC8vIG11c3QgYmUgaWRlbXBvdGVudAogICAgICAgIHJldHVy
biBub3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKHN0ciwgZm9udCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb250UmVuZGVyQ29u
dGV4dCgpKSk7CiAgICB9CgogICAgLyoqIFJldHVybnMgdGhlIEZvbnQgdGhpcyByZW5kZXJlciBp
cyB1c2luZy4gKi8KICAgIHB1YmxpYyBGb250IGdldEZvbnQoKSB7CiAgICAgICAgcmV0dXJuIGZv
bnQ7CiAgICB9CgogICAgLyoqIFJldHVybnMgYSBGb250UmVuZGVyQ29udGV4dCB3aGljaCBjYW4g
YmUgdXNlZCBmb3IgZXh0ZXJuYWwKICAgICAgICB0ZXh0LXJlbGF0ZWQgc2l6ZSBjb21wdXRhdGlv
bnMuIFRoaXMgb2JqZWN0IHNob3VsZCBiZSBjb25zaWRlcmVkCiAgICAgICAgdHJhbnNpZW50IGFu
ZCBtYXkgYmVjb21lIGludmFsaWRhdGVkIGJldHdlZW4ge0BsaW5rCiAgICAgICAgI2JlZ2luUmVu
ZGVyaW5nIGJlZ2luUmVuZGVyaW5nfSAvIHtAbGluayAjZW5kUmVuZGVyaW5nCiAgICAgICAgZW5k
UmVuZGVyaW5nfSBwYWlycy4gKi8KICAgIHB1YmxpYyBGb250UmVuZGVyQ29udGV4dCBnZXRGb250
UmVuZGVyQ29udGV4dCgpIHsKICAgICAgICBpZiAoY2FjaGVkRm9udFJlbmRlckNvbnRleHQgPT0g
bnVsbCkgewogICAgICAgICAgICBjYWNoZWRGb250UmVuZGVyQ29udGV4dCA9IGdldEdyYXBoaWNz
MkQoKS5nZXRGb250UmVuZGVyQ29udGV4dCgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNh
Y2hlZEZvbnRSZW5kZXJDb250ZXh0OwogICAgfQoKICAgIC8qKiBCZWdpbnMgcmVuZGVyaW5nIHdp
dGggdGhpcyB7QGxpbmsgVGV4dFJlbmRlcmVyIFRleHRSZW5kZXJlcn0KICAgICAgICBpbnRvIHRo
ZSBjdXJyZW50IE9wZW5HTCBkcmF3YWJsZSwgcHVzaGluZyB0aGUgcHJvamVjdGlvbiBhbmQKICAg
ICAgICBtb2RlbHZpZXcgbWF0cmljZXMgYW5kIHNvbWUgc3RhdGUgYml0cyBhbmQgc2V0dGluZyB1
cCBhCiAgICAgICAgdHdvLWRpbWVuc2lvbmFsIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIHdpdGgg
KDAsIDApIGFzIHRoZQogICAgICAgIGxvd2VyLWxlZnQgY29vcmRpbmF0ZSBhbmQgKHdpZHRoLCBo
ZWlnaHQpIGFzIHRoZSB1cHBlci1yaWdodAogICAgICAgIGNvb3JkaW5hdGUuIEJpbmRzIGFuZCBl
bmFibGVzIHRoZSBpbnRlcm5hbCBPcGVuR0wgdGV4dHVyZQogICAgICAgIG9iamVjdCwgc2V0cyB0
aGUgdGV4dHVyZSBlbnZpcm9ubWVudCBtb2RlIHRvIEdMX01PRFVMQVRFLCBhbmQKICAgICAgICBj
aGFuZ2VzIHRoZSBjdXJyZW50IGNvbG9yIHRvIHRoZSBsYXN0IGNvbG9yIHNldCB3aXRoIHRoaXMK
ICAgICAgICBUZXh0UmVuZGVyZXIgdmlhIHtAbGluayAjc2V0Q29sb3Igc2V0Q29sb3J9LiBUaGlz
IG1ldGhvZAogICAgICAgIGRpc2FibGVzIHRoZSBkZXB0aCB0ZXN0IGFuZCBpcyBlcXVpdmFsZW50
IHRvCiAgICAgICAgYmVnaW5SZW5kZXJpbmcod2lkdGgsIGhlaWdodCwgdHJ1ZSkuCgogICAgICAg
IEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGN1cnJlbnQgb24tc2NyZWVuIE9wZW5HTCBk
cmF3YWJsZQogICAgICAgIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgY3VycmVudCBv
bi1zY3JlZW4gT3BlbkdMIGRyYXdhYmxlCiAgICAgICAgQHRocm93cyBqYXZheC5tZWRpYS5vcGVu
Z2wuR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBiZWdpblJlbmRlcmlu
ZyhpbnQgd2lkdGgsIGludCBoZWlnaHQpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgYmVn
aW5SZW5kZXJpbmcod2lkdGgsIGhlaWdodCwgdHJ1ZSk7CiAgICB9CgogICAgLyoqIEJlZ2lucyBy
ZW5kZXJpbmcgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIgVGV4dFJlbmRlcmVyfQogICAg
ICAgIGludG8gdGhlIGN1cnJlbnQgT3BlbkdMIGRyYXdhYmxlLCBwdXNoaW5nIHRoZSBwcm9qZWN0
aW9uIGFuZAogICAgICAgIG1vZGVsdmlldyBtYXRyaWNlcyBhbmQgc29tZSBzdGF0ZSBiaXRzIGFu
ZCBzZXR0aW5nIHVwIGEKICAgICAgICB0d28tZGltZW5zaW9uYWwgb3J0aG9ncmFwaGljIHByb2pl
Y3Rpb24gd2l0aCAoMCwgMCkgYXMgdGhlCiAgICAgICAgbG93ZXItbGVmdCBjb29yZGluYXRlIGFu
ZCAod2lkdGgsIGhlaWdodCkgYXMgdGhlIHVwcGVyLXJpZ2h0CiAgICAgICAgY29vcmRpbmF0ZS4g
QmluZHMgYW5kIGVuYWJsZXMgdGhlIGludGVybmFsIE9wZW5HTCB0ZXh0dXJlCiAgICAgICAgb2Jq
ZWN0LCBzZXRzIHRoZSB0ZXh0dXJlIGVudmlyb25tZW50IG1vZGUgdG8gR0xfTU9EVUxBVEUsIGFu
ZAogICAgICAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgY29sb3IgdG8gdGhlIGxhc3QgY29sb3Igc2V0
IHdpdGggdGhpcwogICAgICAgIFRleHRSZW5kZXJlciB2aWEge0BsaW5rICNzZXRDb2xvciBzZXRD
b2xvcn0uIERpc2FibGVzIHRoZSBkZXB0aAogICAgICAgIHRlc3QgaWYgdGhlIGRpc2FibGVEZXB0
aFRlc3QgYXJndW1lbnQgaXMgdHJ1ZS4KCiAgICAgICAgQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBv
ZiB0aGUgY3VycmVudCBvbi1zY3JlZW4gT3BlbkdMIGRyYXdhYmxlCiAgICAgICAgQHBhcmFtIGhl
aWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBjdXJyZW50IG9uLXNjcmVlbiBPcGVuR0wgZHJhd2FibGUK
ICAgICAgICBAcGFyYW0gZGlzYWJsZURlcHRoVGVzdCB3aGV0aGVyIHRvIGRpc2FibGUgdGhlIGRl
cHRoIHRlc3QKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0
IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVi
bGljIHZvaWQgYmVnaW5SZW5kZXJpbmcoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIGRp
c2FibGVEZXB0aFRlc3QpCiAgICAgICAgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBiZWdp
blJlbmRlcmluZyh0cnVlLCB3aWR0aCwgaGVpZ2h0LCBkaXNhYmxlRGVwdGhUZXN0KTsKICAgIH0K
CiAgICAvKiogQmVnaW5zIHJlbmRlcmluZyBvZiAyRCB0ZXh0IGluIDNEIHdpdGggdGhpcyB7QGxp
bmsgVGV4dFJlbmRlcmVyCiAgICAgICAgVGV4dFJlbmRlcmVyfSBpbnRvIHRoZSBjdXJyZW50IE9w
ZW5HTCBkcmF3YWJsZS4gQXNzdW1lcyB0aGUgZW5kCiAgICAgICAgdXNlciBpcyByZXNwb25zaWJs
ZSBmb3Igc2V0dGluZyB1cCB0aGUgbW9kZWx2aWV3IGFuZCBwcm9qZWN0aW9uCiAgICAgICAgbWF0
cmljZXMsIGFuZCB3aWxsIHJlbmRlciB0ZXh0IHVzaW5nIHRoZSB7QGxpbmsgI2RyYXczRCBkcmF3
M0R9CiAgICAgICAgbWV0aG9kLiBUaGlzIG1ldGhvZCBwdXNoZXMgc29tZSBPcGVuR0wgc3RhdGUg
Yml0cywgYmluZHMgYW5kCiAgICAgICAgZW5hYmxlcyB0aGUgaW50ZXJuYWwgT3BlbkdMIHRleHR1
cmUgb2JqZWN0LCBzZXRzIHRoZSB0ZXh0dXJlCiAgICAgICAgZW52aXJvbm1lbnQgbW9kZSB0byBH
TF9NT0RVTEFURSwgYW5kIGNoYW5nZXMgdGhlIGN1cnJlbnQgY29sb3IKICAgICAgICB0byB0aGUg
bGFzdCBjb2xvciBzZXQgd2l0aCB0aGlzIFRleHRSZW5kZXJlciB2aWEge0BsaW5rCiAgICAgICAg
I3NldENvbG9yIHNldENvbG9yfS4KCiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBP
cGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAog
ICAgKi8KICAgIHB1YmxpYyB2b2lkIGJlZ2luM0RSZW5kZXJpbmcoKSB0aHJvd3MgR0xFeGNlcHRp
b24gewogICAgICAgIGJlZ2luUmVuZGVyaW5nKGZhbHNlLCAwLCAwLCBmYWxzZSk7CiAgICB9Cgog
ICAgLyoqIENoYW5nZXMgdGhlIGN1cnJlbnQgY29sb3Igb2YgdGhpcyBUZXh0UmVuZGVyZXIgdG8g
dGhlIHN1cHBsaWVkCiAgICAgICAgb25lLiBUaGUgZGVmYXVsdCBjb2xvciBpcyBvcGFxdWUgd2hp
dGUuCgogICAgICAgIEBwYXJhbSBjb2xvciB0aGUgbmV3IGNvbG9yIHRvIHVzZSBmb3IgcmVuZGVy
aW5nIHRleHQKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0
IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVi
bGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgY29sb3IpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAg
ICAgYm9vbGVhbiBub05lZWRGb3JGbHVzaCA9IChoYXZlQ2FjaGVkQ29sb3IgJiYgKGNhY2hlZENv
bG9yICE9IG51bGwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci5l
cXVhbHMoY2FjaGVkQ29sb3IpKTsKCiAgICAgICAgaWYgKCFub05lZWRGb3JGbHVzaCkgewogICAg
ICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUoKTsKICAgICAgICB9CgogICAgICAgIGdldEJhY2tp
bmdTdG9yZSgpLnNldENvbG9yKGNvbG9yKTsKICAgICAgICBoYXZlQ2FjaGVkQ29sb3IgPSB0cnVl
OwogICAgICAgIGNhY2hlZENvbG9yID0gY29sb3I7CiAgICB9CgogICAgLyoqIENoYW5nZXMgdGhl
IGN1cnJlbnQgY29sb3Igb2YgdGhpcyBUZXh0UmVuZGVyZXIgdG8gdGhlIHN1cHBsaWVkCiAgICAg
ICAgb25lLCB3aGVyZSBlYWNoIGNvbXBvbmVudCByYW5nZXMgZnJvbSAwLjBmIC0gMS4wZi4gVGhl
IGFscGhhCiAgICAgICAgY29tcG9uZW50LCBpZiB1c2VkLCBkb2VzIG5vdCBuZWVkIHRvIGJlIHBy
ZW11bHRpcGxpZWQgaW50byB0aGUKICAgICAgICBjb2xvciBjaGFubmVscyBhcyBkZXNjcmliZWQg
aW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHtAbGluawogICAgICAgIGNvbS5zdW4ub3BlbmdsLnV0
aWwudGV4dHVyZS5UZXh0dXJlIFRleHR1cmV9LCBhbHRob3VnaAogICAgICAgIHByZW11bHRpcGxp
ZWQgY29sb3JzIGFyZSB1c2VkIGludGVybmFsbHkuIFRoZSBkZWZhdWx0IGNvbG9yIGlzCiAgICAg
ICAgb3BhcXVlIHdoaXRlLgoKICAgICAgICBAcGFyYW0gciB0aGUgcmVkIGNvbXBvbmVudCBvZiB0
aGUgbmV3IGNvbG9yCiAgICAgICAgQHBhcmFtIGcgdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUg
bmV3IGNvbG9yCiAgICAgICAgQHBhcmFtIGIgdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBuZXcg
Y29sb3IKICAgICAgICBAcGFyYW0gYSB0aGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSBuZXcgY29s
b3IsIDAuMGYgPSBjb21wbGV0ZWx5CiAgICAgICAgdHJhbnNwYXJlbnQsIDEuMGYgPSBjb21wbGV0
ZWx5IG9wYXF1ZQogICAgICAgIEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRl
eHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBw
dWJsaWMgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQog
ICAgICAgIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgYm9vbGVhbiBub05lZWRGb3JGbHVz
aCA9IChoYXZlQ2FjaGVkQ29sb3IgJiYgKGNhY2hlZENvbG9yID09IG51bGwpICYmCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAociA9PSBjYWNoZWRSKSAmJiAoZyA9PSBjYWNoZWRH
KSAmJiAoYiA9PSBjYWNoZWRCKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGEgPT0gY2FjaGVkQSkpOwoKICAgICAgICBpZiAoIW5vTmVlZEZvckZsdXNoKSB7CiAgICAgICAg
ICAgIGZsdXNoR2x5cGhQaXBlbGluZSgpOwogICAgICAgIH0KCiAgICAgICAgZ2V0QmFja2luZ1N0
b3JlKCkuc2V0Q29sb3IociwgZywgYiwgYSk7CiAgICAgICAgaGF2ZUNhY2hlZENvbG9yID0gdHJ1
ZTsKICAgICAgICBjYWNoZWRSID0gcjsKICAgICAgICBjYWNoZWRHID0gZzsKICAgICAgICBjYWNo
ZWRCID0gYjsKICAgICAgICBjYWNoZWRBID0gYTsKICAgICAgICBjYWNoZWRDb2xvciA9IG51bGw7
CiAgICB9CgogICAgLyoqIERyYXdzIHRoZSBzdXBwbGllZCBDaGFyU2VxdWVuY2UgYXQgdGhlIGRl
c2lyZWQgbG9jYXRpb24gdXNpbmcKICAgICAgICB0aGUgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9y
LiBUaGUgYmFzZWxpbmUgb2YgdGhlIGxlZnRtb3N0CiAgICAgICAgY2hhcmFjdGVyIGlzIGF0IHBv
c2l0aW9uICh4LCB5KSBzcGVjaWZpZWQgaW4gT3BlbkdMIGNvb3JkaW5hdGVzLAogICAgICAgIHdo
ZXJlIHRoZSBvcmlnaW4gaXMgYXQgdGhlIGxvd2VyLWxlZnQgb2YgdGhlIGRyYXdhYmxlIGFuZCB0
aGUgWQogICAgICAgIGNvb3JkaW5hdGUgaW5jcmVhc2VzIGluIHRoZSB1cHdhcmQgZGlyZWN0aW9u
LgoKICAgICAgICBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gZHJhdwogICAgICAgIEBwYXJhbSB4
IHRoZSB4IGNvb3JkaW5hdGUgYXQgd2hpY2ggdG8gZHJhdwogICAgICAgIEBwYXJhbSB5IHRoZSB5
IGNvb3JkaW5hdGUgYXQgd2hpY2ggdG8gZHJhdwogICAgICAgIEB0aHJvd3MgR0xFeGNlcHRpb24g
SWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0aGlzIG1ldGhvZCBpcyBj
YWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBkcmF3KENoYXJTZXF1ZW5jZSBzdHIsIGludCB4
LCBpbnQgeSkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBkcmF3M0Qoc3RyLCB4LCB5LCAw
LCAxKTsKICAgIH0KCiAgICAvKiogRHJhd3MgdGhlIHN1cHBsaWVkIFN0cmluZyBhdCB0aGUgZGVz
aXJlZCBsb2NhdGlvbiB1c2luZyB0aGUKICAgICAgICByZW5kZXJlcidzIGN1cnJlbnQgY29sb3Iu
IFNlZSB7QGxpbmsgI2RyYXcoQ2hhclNlcXVlbmNlLCBpbnQsCiAgICAgICAgaW50KSBkcmF3KENo
YXJTZXF1ZW5jZSwgaW50LCBpbnQpfS4gKi8KICAgIHB1YmxpYyB2b2lkIGRyYXcoU3RyaW5nIHN0
ciwgaW50IHgsIGludCB5KSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGRyYXczRChzdHIs
IHgsIHksIDAsIDEpOwogICAgfQoKICAgIC8qKiBEcmF3cyB0aGUgc3VwcGxpZWQgQ2hhclNlcXVl
bmNlIGF0IHRoZSBkZXNpcmVkIDNEIGxvY2F0aW9uIHVzaW5nCiAgICAgICAgdGhlIHJlbmRlcmVy
J3MgY3VycmVudCBjb2xvci4gVGhlIGJhc2VsaW5lIG9mIHRoZSBsZWZ0bW9zdAogICAgICAgIGNo
YXJhY3RlciBpcyBwbGFjZWQgYXQgcG9zaXRpb24gKHgsIHksIHopIGluIHRoZSBjdXJyZW50CiAg
ICAgICAgY29vcmRpbmF0ZSBzeXN0ZW0uCgogICAgICAgIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0
byBkcmF3CiAgICAgICAgQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBhdCB3aGljaCB0byBkcmF3
CiAgICAgICAgQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBhdCB3aGljaCB0byBkcmF3CiAgICAg
ICAgQHBhcmFtIHogdGhlIHogY29vcmRpbmF0ZSBhdCB3aGljaCB0byBkcmF3CiAgICAgICAgQHBh
cmFtIHNjYWxlRmFjdG9yIGEgdW5pZm9ybSBzY2FsZSBmYWN0b3IgYXBwbGllZCB0byB0aGUgd2lk
dGggYW5kIGhlaWdodCBvZiB0aGUgZHJhd24gcmVjdGFuZ2xlCiAgICAgICAgQHRocm93cyBHTEV4
Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0
aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lkIGRyYXczRChDaGFyU2VxdWVuY2Ug
c3RyLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAgIGZs
b2F0IHNjYWxlRmFjdG9yKSB7CiAgICAgICAgaW50ZXJuYWxfZHJhdzNEKHN0ciwgeCwgeSwgeiwg
c2NhbGVGYWN0b3IpOwogICAgfQoKICAgIC8qKiBEcmF3cyB0aGUgc3VwcGxpZWQgU3RyaW5nIGF0
IHRoZSBkZXNpcmVkIDNEIGxvY2F0aW9uIHVzaW5nIHRoZQogICAgICAgIHJlbmRlcmVyJ3MgY3Vy
cmVudCBjb2xvci4gU2VlIHtAbGluayAjZHJhdzNEKENoYXJTZXF1ZW5jZSwKICAgICAgICBmbG9h
dCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkgZHJhdzNEKENoYXJTZXF1ZW5jZSwgZmxvYXQsIGZsb2F0
LAogICAgICAgIGZsb2F0LCBmbG9hdCl9LiAqLwogICAgcHVibGljIHZvaWQgZHJhdzNEKFN0cmlu
ZyBzdHIsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHNjYWxlRmFjdG9yKSB7CiAg
ICAgICAgaW50ZXJuYWxfZHJhdzNEKHN0ciwgeCwgeSwgeiwgc2NhbGVGYWN0b3IpOwogICAgfQoK
ICAgIC8qKiBSZXR1cm5zIHRoZSBwaXhlbCB3aWR0aCBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyLiAq
LwogICAgcHVibGljIGZsb2F0IGdldENoYXJXaWR0aChjaGFyIGluQ2hhcikgewogICAgICAgIHJl
dHVybiBtR2x5cGhQcm9kdWNlci5nZXRHbHlwaFBpeGVsV2lkdGgoaW5DaGFyKTsKICAgIH0KCiAg
ICAvKiogQ2F1c2VzIHRoZSBUZXh0UmVuZGVyZXIgdG8gZmx1c2ggYW55IGludGVybmFsIGNhY2hl
cyBpdCBtYXkgYmUKICAgICAgICBtYWludGFpbmluZyBhbmQgZHJhdyBpdHMgcmVuZGVyaW5nIHJl
c3VsdHMgdG8gdGhlIHNjcmVlbi4gVGhpcwogICAgICAgIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIg
ZWFjaCBjYWxsIHRvIGRyYXcoKSBpZiB5b3UgYXJlIHNldHRpbmcKICAgICAgICBPcGVuR0wgc3Rh
dGUgc3VjaCBhcyB0aGUgbW9kZWx2aWV3IG1hdHJpeCBiZXR3ZWVuIGNhbGxzIHRvCiAgICAgICAg
ZHJhdygpLiAqLwogICAgcHVibGljIHZvaWQgZmx1c2goKSB7CiAgICAgICAgZmx1c2hHbHlwaFBp
cGVsaW5lKCk7CiAgICB9CgogICAgLyoqIEVuZHMgYSByZW5kZXIgY3ljbGUgd2l0aCB0aGlzIHtA
bGluayBUZXh0UmVuZGVyZXIgVGV4dFJlbmRlcmVyfS4KICAgICAgICBSZXN0b3JlcyB0aGUgcHJv
amVjdGlvbiBhbmQgbW9kZWx2aWV3IG1hdHJpY2VzIGFzIHdlbGwgYXMKICAgICAgICBzZXZlcmFs
IE9wZW5HTCBzdGF0ZSBiaXRzLiBTaG91bGQgYmUgcGFpcmVkIHdpdGgge0BsaW5rCiAgICAgICAg
I2JlZ2luUmVuZGVyaW5nIGJlZ2luUmVuZGVyaW5nfS4KCiAgICAgICAgQHRocm93cyBHTEV4Y2Vw
dGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9k
IGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lkIGVuZFJlbmRlcmluZygpIHRocm93cyBH
TEV4Y2VwdGlvbiB7CiAgICAgICAgZW5kUmVuZGVyaW5nKHRydWUpOwogICAgfQoKICAgIC8qKiBF
bmRzIGEgM0QgcmVuZGVyIGN5Y2xlIHdpdGggdGhpcyB7QGxpbmsgVGV4dFJlbmRlcmVyIFRleHRS
ZW5kZXJlcn0uCiAgICAgICAgUmVzdG9yZXMgc2V2ZXJhbCBPcGVuR0wgc3RhdGUgYml0cy4gU2hv
dWxkIGJlIHBhaXJlZCB3aXRoIHtAbGluawogICAgICAgICNiZWdpbjNEUmVuZGVyaW5nIGJlZ2lu
M0RSZW5kZXJpbmd9LgoKICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBj
b250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwog
ICAgcHVibGljIHZvaWQgZW5kM0RSZW5kZXJpbmcoKSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAg
ICAgIGVuZFJlbmRlcmluZyhmYWxzZSk7CiAgICB9CgogICAgLyoqIERpc3Bvc2VzIG9mIGFsbCBy
ZXNvdXJjZXMgdGhpcyBUZXh0UmVuZGVyZXIgaXMgdXNpbmcuIEl0IGlzIG5vdAogICAgICAgIHZh
bGlkIHRvIHVzZSB0aGUgVGV4dFJlbmRlcmVyIGFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4K
CiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3Qg
Y3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lk
IGRpc3Bvc2UoKSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIHBhY2tlci5kaXNwb3NlKCk7
CiAgICAgICAgcGFja2VyID0gbnVsbDsKICAgICAgICBjYWNoZWRCYWNraW5nU3RvcmUgPSBudWxs
OwogICAgICAgIGNhY2hlZEdyYXBoaWNzID0gbnVsbDsKICAgICAgICBjYWNoZWRGb250UmVuZGVy
Q29udGV4dCA9IG51bGw7CgogICAgICAgIGlmIChkYmdGcmFtZSAhPSBudWxsKSB7CiAgICAgICAg
ICAgIGRiZ0ZyYW1lLmRpc3Bvc2UoKTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCiAgICAvLyBJbnRlcm5hbHMgb25seSBiZWxvdyB0aGlzIHBvaW50CiAgICAvLwoKICAgIHBy
aXZhdGUgc3RhdGljIFJlY3RhbmdsZTJEIHByZU5vcm1hbGl6ZShSZWN0YW5nbGUyRCBzcmMpIHsK
ICAgICAgICAvLyBOZWVkIHRvIHJvdW5kIHRvIGludGVnZXIgY29vcmRpbmF0ZXMKICAgICAgICAv
LyBBbHNvIGdpdmUgb3Vyc2VsdmVzIGEgbGl0dGxlIHNsb3AgYXJvdW5kIHRoZSByZXBvcnRlZAog
ICAgICAgIC8vIGJvdW5kcyBvZiBnbHlwaHMgYmVjYXVzZSBpdCBsb29rcyBsaWtlIG5laXRoZXIg
dGhlIHZpc3VhbAogICAgICAgIC8vIG5vciB0aGUgcGl4ZWwgYm91bmRzIHdvcmtzIHBlcmZlY3Rs
eSB3ZWxsCiAgICAgICAgaW50IG1pblggPSAoaW50KSBNYXRoLmZsb29yKHNyYy5nZXRNaW5YKCkp
IC0gMTsKICAgICAgICBpbnQgbWluWSA9IChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1pblkoKSkg
LSAxOwogICAgICAgIGludCBtYXhYID0gKGludCkgTWF0aC5jZWlsKHNyYy5nZXRNYXhYKCkpICsg
MTsKICAgICAgICBpbnQgbWF4WSA9IChpbnQpIE1hdGguY2VpbChzcmMuZ2V0TWF4WSgpKSArIDE7
CiAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUobWluWCwgbWluWSwgbWF4WCAt
IG1pblgsIG1heFkgLSBtaW5ZKTsKICAgIH0KCgogICAgcHJpdmF0ZSBSZWN0YW5nbGUyRCBub3Jt
YWxpemUoUmVjdGFuZ2xlMkQgc3JjKSB7CiAgICAgICAgLy8gR2l2ZSBvdXJzZWx2ZXMgYSBib3Vu
ZGFyeSBhcm91bmQgZWFjaCBlbnRpdHkgb24gdGhlIGJhY2tpbmcKICAgICAgICAvLyBzdG9yZSBp
biBvcmRlciB0byBwcmV2ZW50IGJsZWVkaW5nIG9mIG5lYXJieSBTdHJpbmdzIGR1ZSB0bwogICAg
ICAgIC8vIHRoZSBmYWN0IHRoYXQgd2UgdXNlIGxpbmVhciBmaWx0ZXJpbmcKCiAgICAgICAgLy8g
Tk9URSB0aGF0IHRoaXMgYm91bmRhcnkgaXMgcXVpdGUgaGV1cmlzdGljIGFuZCBpcyByZWxhdGVk
CiAgICAgICAgLy8gdG8gaG93IGZhciBhd2F5IGluIDNEIHdlIG1heSB2aWV3IHRoZSB0ZXh0IC0t
CiAgICAgICAgLy8gaGV1cmlzdGljYWxseSwgMS41JSBvZiB0aGUgZm9udCdzIGhlaWdodAogICAg
ICAgIGludCBib3VuZGFyeSA9IChpbnQpIE1hdGgubWF4KDEsIDAuMDE1ICogZm9udC5nZXRTaXpl
KCkpOwoKICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZTJELkRvdWJsZSgoaW50KSBNYXRoLmZs
b29yKHNyYy5nZXRNaW5YKCkgLSBib3VuZGFyeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGludCkgTWF0aC5mbG9vcihzcmMuZ2V0TWluWSgpIC0gYm91bmRhcnkpLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChzcmMu
Z2V0V2lkdGgoKSArIDIgKiBib3VuZGFyeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKGludCkgTWF0aC5jZWlsKHNyYy5nZXRIZWlnaHQoKSkgKyAyICogYm91bmRhcnkp
OwogICAgfQoKICAgIHByaXZhdGUgVGV4dHVyZVJlbmRlcmVyIGdldEJhY2tpbmdTdG9yZSgpIHsK
ICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBwYWNr
ZXIuZ2V0QmFja2luZ1N0b3JlKCk7CgogICAgICAgIGlmIChyZW5kZXJlciAhPSBjYWNoZWRCYWNr
aW5nU3RvcmUpIHsKICAgICAgICAgICAgLy8gQmFja2luZyBzdG9yZSBjaGFuZ2VkIHNpbmNlIGxh
c3QgdGltZTsgZGlzY2FyZCBhbnkgY2FjaGVkIEdyYXBoaWNzMkQKICAgICAgICAgICAgaWYgKGNh
Y2hlZEdyYXBoaWNzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzLmRp
c3Bvc2UoKTsKICAgICAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzID0gbnVsbDsKICAgICAgICAg
ICAgICAgIGNhY2hlZEZvbnRSZW5kZXJDb250ZXh0ID0gbnVsbDsKICAgICAgICAgICAgfQoKICAg
ICAgICAgICAgY2FjaGVkQmFja2luZ1N0b3JlID0gcmVuZGVyZXI7CiAgICAgICAgfQoKICAgICAg
ICByZXR1cm4gY2FjaGVkQmFja2luZ1N0b3JlOwogICAgfQoKICAgIHByaXZhdGUgR3JhcGhpY3My
RCBnZXRHcmFwaGljczJEKCkgewogICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdl
dEJhY2tpbmdTdG9yZSgpOwoKICAgICAgICBpZiAoY2FjaGVkR3JhcGhpY3MgPT0gbnVsbCkgewog
ICAgICAgICAgICBjYWNoZWRHcmFwaGljcyA9IHJlbmRlcmVyLmNyZWF0ZUdyYXBoaWNzKCk7Cgog
ICAgICAgICAgICAvLyBTZXQgdXAgY29tcG9zaXRlLCBmb250IGFuZCByZW5kZXJpbmcgaGludHMK
ICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3Muc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRlLlNy
Yyk7CiAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzLnNldENvbG9yKENvbG9yLldISVRFKTsKICAg
ICAgICAgICAgY2FjaGVkR3JhcGhpY3Muc2V0Rm9udChmb250KTsKICAgICAgICAgICAgY2FjaGVk
R3JhcGhpY3Muc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfVEVYVF9BTlRJQUxJ
QVNJTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFudGlh
bGlhc2VkID8gUmVuZGVyaW5nSGludHMuVkFMVUVfVEVYVF9BTlRJQUxJQVNfT04KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSZW5kZXJpbmdIaW50cy5WQUxV
RV9URVhUX0FOVElBTElBU19PRkYpKTsKICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3Muc2V0UmVu
ZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfRlJBQ1RJT05BTE1FVFJJQ1MsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUZyYWN0aW9uYWxNZXRyaWNz
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUmVuZGVyaW5n
SGludHMuVkFMVUVfRlJBQ1RJT05BTE1FVFJJQ1NfT04KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgOiBSZW5kZXJpbmdIaW50cy5WQUxVRV9GUkFDVElPTkFMTUVU
UklDU19PRkYpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjYWNoZWRHcmFwaGljczsKICAg
IH0KCiAgICBwcml2YXRlIHZvaWQgYmVnaW5SZW5kZXJpbmcoYm9vbGVhbiBvcnRobywgaW50IHdp
ZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4g
ZGlzYWJsZURlcHRoVGVzdEZvck9ydGhvKSB7CiAgICAgICAgaWYgKERFQlVHICYmICFkZWJ1Z2dl
ZCkgewogICAgICAgICAgICBkZWJ1ZygpOwogICAgICAgIH0KCiAgICAgICAgaW5CZWdpbkVuZFBh
aXIgPSB0cnVlOwogICAgICAgIGlzT3J0aG9Nb2RlID0gb3J0aG87CiAgICAgICAgYmVnaW5SZW5k
ZXJpbmdXaWR0aCA9IHdpZHRoOwogICAgICAgIGJlZ2luUmVuZGVyaW5nSGVpZ2h0ID0gaGVpZ2h0
OwogICAgICAgIGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQgPSBkaXNhYmxlRGVwdGhU
ZXN0Rm9yT3J0aG87CgogICAgICAgIGlmIChvcnRobykgewogICAgICAgICAgICBnZXRCYWNraW5n
U3RvcmUoKS5iZWdpbk9ydGhvUmVuZGVyaW5nKHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdEZvck9y
dGhvKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5iZWdp
bjNEUmVuZGVyaW5nKCk7CiAgICAgICAgfQoKICAgICAgICBHTCBnbCA9IEdMVS5nZXRDdXJyZW50
R0woKTsKCiAgICAgICAgLy8gUHVzaCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUgcGlw
ZWxpbmVkIHF1YWQgcmVuZGVyZXIKICAgICAgICBnbC5nbFB1c2hDbGllbnRBdHRyaWIoKGludCkg
R0wuR0xfQUxMX0NMSUVOVF9BVFRSSUJfQklUUyk7CgogICAgICAgIGlmICghaGF2ZU1heFNpemUp
IHsKICAgICAgICAgICAgLy8gUXVlcnkgT3BlbkdMIGZvciB0aGUgbWF4aW11bSB0ZXh0dXJlIHNp
emUgYW5kIHNldCBpdCBpbiB0aGUKICAgICAgICAgICAgLy8gUmVjdGFuZ2xlUGFja2VyIHRvIGtl
ZXAgaXQgZnJvbSBleHBhbmRpbmcgdG9vIGxhcmdlCiAgICAgICAgICAgIGludFtdIHN6ID0gbmV3
IGludFsxXTsKICAgICAgICAgICAgZ2wuZ2xHZXRJbnRlZ2VydihHTC5HTF9NQVhfVEVYVFVSRV9T
SVpFLCBzeiwgMCk7CiAgICAgICAgICAgIHBhY2tlci5zZXRNYXhTaXplKHN6WzBdLCBzelswXSk7
CiAgICAgICAgICAgIGhhdmVNYXhTaXplID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmIChu
ZWVkVG9SZXNldENvbG9yICYmIGhhdmVDYWNoZWRDb2xvcikgewogICAgICAgICAgICBpZiAoY2Fj
aGVkQ29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuc2V0
Q29sb3IoY2FjaGVkUiwgY2FjaGVkRywgY2FjaGVkQiwgY2FjaGVkQSk7CiAgICAgICAgICAgIH0g
ZWxzZSB7CiAgICAgICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5zZXRDb2xvcihjYWNoZWRD
b2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5lZWRUb1Jlc2V0Q29sb3IgPSBmYWxz
ZTsKICAgICAgICB9CgogICAgICAgIC8vIERpc2FibGUgZnV0dXJlIGF0dGVtcHRzIHRvIHVzZSBt
aXBtYXBwaW5nIGlmIFRleHR1cmVSZW5kZXJlcgogICAgICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCBp
dAogICAgICAgIGlmIChtaXBtYXAgJiYgIWdldEJhY2tpbmdTdG9yZSgpLmlzVXNpbmdBdXRvTWlw
bWFwR2VuZXJhdGlvbigpKSB7CiAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAg
ICAgU3lzdGVtLmVyci5wcmludGxuKCJEaXNhYmxlZCBtaXBtYXBwaW5nIGluIFRleHRSZW5kZXJl
ciIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtaXBtYXAgPSBmYWxzZTsKICAgICAgICB9
CiAgICB9CgogICAgLyoqCiAgICAgKiBlbXppYzogaGVyZSB0aGUgY2FsbCB0byBnbEJpbmRCdWZm
ZXIgY3Jhc2hlcyBvbiBjZXJ0YWluIGdyYXBoaWNzY2FyZC9kcml2ZXIgY29tYmluYXRpb25zCiAg
ICAgKiB0aGlzIGlzIHdoeSB0aGUgdWdseSB0cnktY2F0Y2ggYmxvY2sgaGFzIGJlZW4gYWRkZWQs
IHdoaWNoIGZhbGxzIGJhY2sgdG8gdGhlIG9sZCB0ZXh0cmVuZGVyZXIKICAgICAqIAogICAgICog
QHBhcmFtIG9ydGhvCiAgICAgKiBAdGhyb3dzIEdMRXhjZXB0aW9uCiAgICAgKi8KICAgIHByaXZh
dGUgdm9pZCBlbmRSZW5kZXJpbmcoYm9vbGVhbiBvcnRobykgdGhyb3dzIEdMRXhjZXB0aW9uIHsK
ICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUoKTsKCiAgICAgICAgaW5CZWdpbkVuZFBhaXIgPSBm
YWxzZTsKCiAgICAgICAgR0wgZ2wgPSBHTFUuZ2V0Q3VycmVudEdMKCk7CgogICAgICAgIC8vIFBv
cCBjbGllbnQgYXR0cmliIGJpdHMgdXNlZCBieSB0aGUgcGlwZWxpbmVkIHF1YWQgcmVuZGVyZXIK
ICAgICAgICBnbC5nbFBvcENsaWVudEF0dHJpYigpOwoKICAgICAgICAvLyBUaGUgT3BlbkdMIHNw
ZWMgaXMgdW5jbGVhciBhYm91dCB3aGV0aGVyIHRoaXMgY2hhbmdlcyB0aGUKICAgICAgICAvLyBi
dWZmZXIgYmluZGluZ3MsIHNvIHByZWVtcHRpdmVseSB6ZXJvIG91dCB0aGUgR0xfQVJSQVlfQlVG
RkVSCiAgICAgICAgLy8gYmluZGluZwogICAgICAgIGlmIChpczE1QXZhaWxhYmxlKGdsKSkgewog
ICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FS
UkFZX0JVRkZFUiwgMCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAg
ICAgICAgICAgICBpc0V4dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJTSU9OXzFfNSA9IGZhbHNlOwog
ICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAob3J0aG8pIHsKICAgICAgICAgICAg
Z2V0QmFja2luZ1N0b3JlKCkuZW5kT3J0aG9SZW5kZXJpbmcoKTsKICAgICAgICB9IGVsc2Ugewog
ICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5lbmQzRFJlbmRlcmluZygpOwogICAgICAgIH0K
CiAgICAgICAgaWYgKCsrbnVtUmVuZGVyQ3ljbGVzID49IENZQ0xFU19QRVJfRkxVU0gpIHsKICAg
ICAgICAgICAgbnVtUmVuZGVyQ3ljbGVzID0gMDsKCiAgICAgICAgICAgIGlmIChERUJVRykgewog
ICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDbGVhcmluZyB1bnVzZWQgZW50cmll
cyBpbiBlbmRSZW5kZXJpbmcoKSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjbGVhclVu
dXNlZEVudHJpZXMoKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGNsZWFyVW51
c2VkRW50cmllcygpIHsKICAgICAgICBmaW5hbCBqYXZhLnV0aWwuTGlzdCBkZWFkUmVjdHMgPSBu
ZXcgQXJyYXlMaXN0IC8qPFJlY3Q+Ki8oKTsKCiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRo
ZSBjb250ZW50cyBvZiB0aGUgYmFja2luZyBzdG9yZSwgcmVtb3ZpbmcKICAgICAgICAvLyB0ZXh0
IHN0cmluZ3MgdGhhdCBoYXZlbid0IGJlZW4gdXNlZCByZWNlbnRseQogICAgICAgIHBhY2tlci52
aXNpdChuZXcgUmVjdFZpc2l0b3IoKSB7CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNp
dChSZWN0IHJlY3QpIHsKICAgICAgICAgICAgICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRleHRE
YXRhKSByZWN0LmdldFVzZXJEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnVz
ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNsZWFyVXNlZCgpOwogICAgICAg
ICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlYWRSZWN0cy5h
ZGQocmVjdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICB9KTsKCiAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZGVhZFJlY3RzLml0ZXJhdG9y
KCk7IGl0ZXIuaGFzTmV4dCgpOykgewogICAgICAgICAgICBSZWN0IHIgPSAoUmVjdCkgaXRlci5u
ZXh0KCk7CiAgICAgICAgICAgIHBhY2tlci5yZW1vdmUocik7CiAgICAgICAgICAgIHN0cmluZ0xv
Y2F0aW9ucy5yZW1vdmUoKChUZXh0RGF0YSkgci5nZXRVc2VyRGF0YSgpKS5zdHJpbmcoKSk7Cgog
ICAgICAgICAgICBpbnQgdW5pY29kZVRvQ2xlYXJGcm9tQ2FjaGUgPSAoKFRleHREYXRhKSByLmdl
dFVzZXJEYXRhKCkpLnVuaWNvZGVJRDsKCiAgICAgICAgICAgIGlmICh1bmljb2RlVG9DbGVhckZy
b21DYWNoZSA+IDApIHsKICAgICAgICAgICAgICAgIG1HbHlwaFByb2R1Y2VyLmNsZWFyQ2FjaGVF
bnRyeSh1bmljb2RlVG9DbGVhckZyb21DYWNoZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAg
IC8vICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgIC8vICAgICAgICBHcmFwaGljczJEIGcg
PSBnZXRHcmFwaGljczJEKCk7CiAgICAgICAgICAgIC8vICAgICAgICBnLnNldENvbXBvc2l0ZShB
bHBoYUNvbXBvc2l0ZS5DbGVhcik7CiAgICAgICAgICAgIC8vICAgICAgICBnLmZpbGxSZWN0KHIu
eCgpLCByLnkoKSwgci53KCksIHIuaCgpKTsKICAgICAgICAgICAgLy8gICAgICAgIGcuc2V0Q29t
cG9zaXRlKEFscGhhQ29tcG9zaXRlLlNyYyk7CiAgICAgICAgICAgIC8vICAgICAgfQogICAgICAg
IH0KCiAgICAgICAgLy8gSWYgd2UgcmVtb3ZlZCBkZWFkIHJlY3RhbmdsZXMgdGhpcyBjeWNsZSwg
dHJ5IHRvIGRvIGEgY29tcGFjdGlvbgogICAgICAgIGZsb2F0IGZyYWcgPSBwYWNrZXIudmVydGlj
YWxGcmFnbWVudGF0aW9uUmF0aW8oKTsKCiAgICAgICAgaWYgKCFkZWFkUmVjdHMuaXNFbXB0eSgp
ICYmIChmcmFnID4gTUFYX1ZFUlRJQ0FMX0ZSQUdNRU5UQVRJT04pKSB7CiAgICAgICAgICAgIGlm
IChERUJVRykgewogICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYWN0aW5nIFRleHRSZW5kZXJlciBiYWNraW5n
IHN0b3JlIGR1ZSB0byB2ZXJ0aWNhbCBmcmFnbWVudGF0aW9uICIgKwogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGZyYWcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwYWNr
ZXIuY29tcGFjdCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAg
IGdldEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eSgwLCAwLCBnZXRCYWNraW5nU3RvcmUoKS5nZXRX
aWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmFja2lu
Z1N0b3JlKCkuZ2V0SGVpZ2h0KCkpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQg
aW50ZXJuYWxfZHJhdzNEKENoYXJTZXF1ZW5jZSBzdHIsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0
IHosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlRmFjdG9yKSB7
CiAgICAgICAgTGlzdC8qPEdseXBoPiovIGdseXBocyA9IG1HbHlwaFByb2R1Y2VyLmdldEdseXBo
cyhzdHIpOwogICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdseXBocy5pdGVyYXRvcigpOyBp
dGVyLmhhc05leHQoKTsgKSB7CiAgICAgICAgICAgIEdseXBoIGdseXBoID0gKEdseXBoKSBpdGVy
Lm5leHQoKTsKICAgICAgICAgICAgZmxvYXQgYWR2YW5jZSA9IGdseXBoLmRyYXczRCh4LCB5LCB6
LCBzY2FsZUZhY3Rvcik7CiAgICAgICAgICAgIHggKz0gYWR2YW5jZSAqIHNjYWxlRmFjdG9yOwog
ICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgZmx1c2hHbHlwaFBpcGVsaW5lKCkgewog
ICAgICAgIGlmIChtUGlwZWxpbmVkUXVhZFJlbmRlcmVyICE9IG51bGwpIHsKICAgICAgICAgICAg
bVBpcGVsaW5lZFF1YWRSZW5kZXJlci5kcmF3KCk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZh
dGUgdm9pZCBkcmF3M0RfUk9CVVNUKENoYXJTZXF1ZW5jZSBzdHIsIGZsb2F0IHgsIGZsb2F0IHks
IGZsb2F0IHosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZUZhY3Rv
cikgewogICAgICAgIFN0cmluZyBjdXJTdHI7CiAgICAgICAgaWYgKHN0ciBpbnN0YW5jZW9mIFN0
cmluZykgewogICAgICAgICAgICBjdXJTdHIgPSAoU3RyaW5nKSBzdHI7CiAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgY3VyU3RyID0gc3RyLnRvU3RyaW5nKCk7CiAgICAgICAgfQoKICAgICAg
ICAvLyBMb29rIHVwIHRoZSBzdHJpbmcgb24gdGhlIGJhY2tpbmcgc3RvcmUKICAgICAgICBSZWN0
IHJlY3QgPSAoUmVjdCkgc3RyaW5nTG9jYXRpb25zLmdldChjdXJTdHIpOwoKICAgICAgICBpZiAo
cmVjdCA9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFJhc3Rlcml6ZSB0aGlzIHN0cmluZyBhbmQg
cGxhY2UgaXQgb24gdGhlIGJhY2tpbmcgc3RvcmUKICAgICAgICAgICAgR3JhcGhpY3MyRCBnID0g
Z2V0R3JhcGhpY3MyRCgpOwogICAgICAgICAgICBSZWN0YW5nbGUyRCBvcmlnQkJveCA9IHByZU5v
cm1hbGl6ZShyZW5kZXJEZWxlZ2F0ZS5nZXRCb3VuZHMoY3VyU3RyLCBmb250LCBnZXRGb250UmVu
ZGVyQ29udGV4dCgpKSk7CiAgICAgICAgICAgIFJlY3RhbmdsZTJEIGJib3ggPSBub3JtYWxpemUo
b3JpZ0JCb3gpOwogICAgICAgICAgICBQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQoKGludCkgLWJi
b3guZ2V0TWluWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkg
LWJib3guZ2V0TWluWSgpKTsKICAgICAgICAgICAgcmVjdCA9IG5ldyBSZWN0KDAsIDAsIChpbnQp
IGJib3guZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIGJib3gu
Z2V0SGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dERhdGEoY3Vy
U3RyLCBvcmlnaW4sIG9yaWdCQm94LCAtMSkpOwoKICAgICAgICAgICAgcGFja2VyLmFkZChyZWN0
KTsKICAgICAgICAgICAgc3RyaW5nTG9jYXRpb25zLnB1dChjdXJTdHIsIHJlY3QpOwoKICAgICAg
ICAgICAgLy8gUmUtZmV0Y2ggdGhlIEdyYXBoaWNzMkQgaW4gY2FzZSB0aGUgYWRkaXRpb24gb2Yg
dGhlIHJlY3RhbmdsZQogICAgICAgICAgICAvLyBjYXVzZWQgdGhlIG9sZCBiYWNraW5nIHN0b3Jl
IHRvIGJlIHRocm93biBhd2F5CiAgICAgICAgICAgIGcgPSBnZXRHcmFwaGljczJEKCk7CgogICAg
ICAgICAgICAvLyBPSywgc2hvdWxkIG5vdyBoYXZlIGFuICh4LCB5KSBmb3IgdGhpcyByZWN0YW5n
bGU7IHJhc3Rlcml6ZQogICAgICAgICAgICAvLyB0aGUgU3RyaW5nCiAgICAgICAgICAgIGludCBz
dHJ4ID0gcmVjdC54KCkgKyBvcmlnaW4ueDsKICAgICAgICAgICAgaW50IHN0cnkgPSByZWN0Lnko
KSArIG9yaWdpbi55OwoKICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBhcmVhIHdlJ3JlIGdv
aW5nIHRvIGRyYXcgaW50bwogICAgICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0
ZS5DbGVhcik7CiAgICAgICAgICAgIGcuZmlsbFJlY3QocmVjdC54KCksIHJlY3QueSgpLCByZWN0
LncoKSwgcmVjdC5oKCkpOwogICAgICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0
ZS5TcmMpOwoKICAgICAgICAgICAgLy8gRHJhdyB0aGUgc3RyaW5nCiAgICAgICAgICAgIHJlbmRl
ckRlbGVnYXRlLmRyYXcoZywgY3VyU3RyLCBzdHJ4LCBzdHJ5KTsKCiAgICAgICAgICAgIGlmIChE
UkFXX0JCT1hFUykgewogICAgICAgICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkg
cmVjdC5nZXRVc2VyRGF0YSgpOwogICAgICAgICAgICAgICAgLy8gRHJhdyBhIGJvdW5kaW5nIGJv
eCBvbiB0aGUgYmFja2luZyBzdG9yZQogICAgICAgICAgICAgICAgZy5kcmF3UmVjdChzdHJ4IC0g
ZGF0YS5vcmlnT3JpZ2luWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ5IC0gZGF0
YS5vcmlnT3JpZ2luWSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBkYXRhLm9y
aWdSZWN0KCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgZGF0
YS5vcmlnUmVjdCgpLmdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgIGcuZHJhd1JlY3Qoc3Ry
eCAtIGRhdGEub3JpZ2luKCkueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyeSAtIGRh
dGEub3JpZ2luKCkueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53KCksCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAg
ICAgLy8gTWFyayB0aGlzIHJlZ2lvbiBvZiB0aGUgVGV4dHVyZVJlbmRlcmVyIGFzIGRpcnR5CiAg
ICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eShyZWN0LngoKSwgcmVjdC55KCks
IHJlY3QudygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5o
KCkpOwogICAgICAgIH0KCiAgICAgICAgLy8gT0ssIG5vdyBkcmF3IHRoZSBwb3J0aW9uIG9mIHRo
ZSBiYWNraW5nIHN0b3JlIHRvIHRoZSBzY3JlZW4KICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVu
ZGVyZXIgPSBnZXRCYWNraW5nU3RvcmUoKTsKCiAgICAgICAgLy8gTk9URSB0aGF0IHRoZSByZWN0
YW5nbGVzIG1hbmFnZWQgYnkgdGhlIHBhY2tlciBoYXZlIHRoZWlyCiAgICAgICAgLy8gb3JpZ2lu
IGF0IHRoZSB1cHBlci1sZWZ0IGJ1dCB0aGUgVGV4dHVyZVJlbmRlcmVyJ3Mgb3JpZ2luIGlzCiAg
ICAgICAgLy8gYXQgaXRzIGxvd2VyIGxlZnQhISEKICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRl
eHREYXRhKSByZWN0LmdldFVzZXJEYXRhKCk7CiAgICAgICAgZGF0YS5tYXJrVXNlZCgpOwoKICAg
ICAgICBSZWN0YW5nbGUyRCBvcmlnUmVjdCA9IGRhdGEub3JpZ1JlY3QoKTsKICAgICAgICAKICAg
ICAgICAvLyBBbGlnbiB0aGUgbGVmdG1vc3QgcG9pbnQgb2YgdGhlIGJhc2VsaW5lIHRvIHRoZSAo
eCwgeSwgeikgY29vcmRpbmF0ZSByZXF1ZXN0ZWQKICAgICAgICByZW5kZXJlci5kcmF3M0RSZWN0
KHggLSAoc2NhbGVGYWN0b3IgKiBkYXRhLm9yaWdPcmlnaW5YKCkpLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgeSAtIChzY2FsZUZhY3RvciAqICgoZmxvYXQpIG9yaWdSZWN0LmdldEhlaWdo
dCgpIC0gZGF0YS5vcmlnT3JpZ2luWSgpKSksIHosCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZWN0LngoKSArIChkYXRhLm9yaWdpbigpLnggLSBkYXRhLm9yaWdPcmlnaW5YKCkpLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkgLSByZWN0LnkoKSAt
IChpbnQpIG9yaWdSZWN0LmdldEhlaWdodCgpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGRhdGEub3JpZ2luKCkueSAtIGRhdGEub3JpZ09yaWdpblkoKSksCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoaW50KSBvcmlnUmVjdC5nZXRXaWR0aCgpLCAoaW50KSBvcmlnUmVjdC5n
ZXRIZWlnaHQoKSwgc2NhbGVGYWN0b3IpOwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAg
Ly8gRGVidWdnaW5nIGZ1bmN0aW9uYWxpdHkKICAgIC8vCiAgICBwcml2YXRlIHZvaWQgZGVidWco
KSB7CiAgICAgICAgZGJnRnJhbWUgPSBuZXcgRnJhbWUoIlRleHRSZW5kZXJlciBEZWJ1ZyBPdXRw
dXQiKTsKCiAgICAgICAgR0xDYW52YXMgZGJnQ2FudmFzID0gbmV3IEdMQ2FudmFzKG5ldyBHTENh
cGFiaWxpdGllcygpLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBHTENvbnRleHQuZ2V0Q3VycmVudCgpLCBudWxsKTsKICAgICAgICBkYmdDYW52YXMuYWRk
R0xFdmVudExpc3RlbmVyKG5ldyBEZWJ1Z0xpc3RlbmVyKGRiZ0ZyYW1lKSk7CiAgICAgICAgZGJn
RnJhbWUuYWRkKGRiZ0NhbnZhcyk7CgogICAgICAgIGZpbmFsIEZQU0FuaW1hdG9yIGFuaW0gPSBu
ZXcgRlBTQW5pbWF0b3IoZGJnQ2FudmFzLCAxMCk7CiAgICAgICAgZGJnRnJhbWUuYWRkV2luZG93
TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKSB7CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9p
ZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBS
dW4gdGhpcyBvbiBhbm90aGVyIHRocmVhZCB0aGFuIHRoZSBBV1QgZXZlbnQgcXVldWUgdG8KICAg
ICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGNhbGwgdG8gQW5pbWF0b3Iuc3RvcCgp
IGNvbXBsZXRlcyBiZWZvcmUKICAgICAgICAgICAgICAgICAgICAvLyBleGl0aW5nCiAgICAgICAg
ICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYW5pbS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg
ICAgICAgICAgICAgICAgIH0pLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg
IH0pOwogICAgICAgIGRiZ0ZyYW1lLnNldFNpemUoa1NpemUsIGtTaXplKTsKICAgICAgICBkYmdG
cmFtZS5zZXRWaXNpYmxlKHRydWUpOwogICAgICAgIGFuaW0uc3RhcnQoKTsKICAgICAgICBkZWJ1
Z2dlZCA9IHRydWU7CiAgICB9CgogICAgLyoqIENsYXNzIHN1cHBvcnRpbmcgbW9yZSBmdWxsIGNv
bnRyb2wgb3ZlciB0aGUgcHJvY2VzcyBvZiByZW5kZXJpbmcKICAgICAgICB0aGUgYml0bWFwcGVk
IHRleHQuIEFsbG93cyBjdXN0b21pemF0aW9uIG9mIHdoZXRoZXIgdGhlIGJhY2tpbmcKICAgICAg
ICBzdG9yZSB0ZXh0IGJpdG1hcCBpcyBmdWxsLWNvbG9yIG9yIGludGVuc2l0eSBvbmx5LCB0aGUg
c2l6ZSBvZgogICAgICAgIGVhY2ggaW5kaXZpZHVhbCByZW5kZXJlZCB0ZXh0IHJlY3RhbmdsZSwg
YW5kIHRoZSBjb250ZW50cyBvZgogICAgICAgIGVhY2ggaW5kaXZpZHVhbCByZW5kZXJlZCB0ZXh0
IHN0cmluZy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICBvZiB0aGlzIGludGVy
ZmFjZSB1c2VzIGFuIGludGVuc2l0eS1vbmx5IHRleHR1cmUsIGEKICAgICAgICBjbG9zZWx5LWNy
b3BwZWQgcmVjdGFuZ2xlIGFyb3VuZCB0aGUgdGV4dCwgYW5kIHJlbmRlcnMgdGV4dAogICAgICAg
IHVzaW5nIHRoZSBjb2xvciB3aGl0ZSwgd2hpY2ggaXMgbW9kdWxhdGVkIGJ5IHRoZSBzZXQgY29s
b3IKICAgICAgICBkdXJpbmcgdGhlIHJlbmRlcmluZyBwcm9jZXNzLiAqLwogICAgcHVibGljIHN0
YXRpYyBpbnRlcmZhY2UgUmVuZGVyRGVsZWdhdGUgewogICAgICAgIC8qKiBJbmRpY2F0ZXMgd2hl
dGhlciB0aGUgYmFja2luZyBzdG9yZSBvZiB0aGlzIFRleHRSZW5kZXJlcgogICAgICAgICAgICBz
aG91bGQgYmUgaW50ZW5zaXR5LW9ubHkgKHRoZSBkZWZhdWx0KSBvciBmdWxsLWNvbG9yLiAqLwog
ICAgICAgIHB1YmxpYyBib29sZWFuIGludGVuc2l0eU9ubHkoKTsKCiAgICAgICAgLyoqIENvbXB1
dGVzIHRoZSBib3VuZHMgb2YgdGhlIGdpdmVuIFN0cmluZyByZWxhdGl2ZSB0byB0aGUKICAgICAg
ICAgICAgb3JpZ2luLiAqLwogICAgICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoU3Ry
aW5nIHN0ciwgRm9udCBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Rm9udFJlbmRlckNvbnRleHQgZnJjKTsKCiAgICAgICAgLyoqIENvbXB1dGVzIHRoZSBib3VuZHMg
b2YgdGhlIGdpdmVuIGNoYXJhY3RlciBzZXF1ZW5jZSByZWxhdGl2ZQogICAgICAgICAgICB0byB0
aGUgb3JpZ2luLiAqLwogICAgICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMoQ2hhclNl
cXVlbmNlIHN0ciwgRm9udCBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgRm9udFJlbmRlckNvbnRleHQgZnJjKTsKCiAgICAgICAgLyoqIENvbXB1dGVzIHRoZSBib3Vu
ZHMgb2YgdGhlIGdpdmVuIEdseXBoVmVjdG9yLCBhbHJlYWR5CiAgICAgICAgICAgIGFzc3VtZWQg
dG8gaGF2ZSBiZWVuIGNyZWF0ZWQgZm9yIGEgcGFydGljdWxhciBGb250LAogICAgICAgICAgICBy
ZWxhdGl2ZSB0byB0aGUgb3JpZ2luLiAqLwogICAgICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRC
b3VuZHMoR2x5cGhWZWN0b3IgZ3YsIEZvbnRSZW5kZXJDb250ZXh0IGZyYyk7CgogICAgICAgIC8q
KiBSZW5kZXIgdGhlIHBhc3NlZCBjaGFyYWN0ZXIgc2VxdWVuY2UgYXQgdGhlIGRlc2lnbmF0ZWQK
ICAgICAgICAgICAgbG9jYXRpb24gdXNpbmcgdGhlIHN1cHBsaWVkIEdyYXBoaWNzMkQgaW5zdGFu
Y2UuIFRoZQogICAgICAgICAgICBzdXJyb3VuZGluZyByZWdpb24gd2lsbCBhbHJlYWR5IGhhdmUg
YmVlbiBjbGVhcmVkIHRvIHRoZSBSR0IKICAgICAgICAgICAgY29sb3IgKDAsIDAsIDApIHdpdGgg
emVybyBhbHBoYS4gVGhlIGluaXRpYWwgZHJhd2luZyBjb250ZXh0CiAgICAgICAgICAgIG9mIHRo
ZSBwYXNzZWQgR3JhcGhpY3MyRCB3aWxsIGJlIHNldCB0byB1c2UKICAgICAgICAgICAgQWxwaGFD
b21wb3NpdGUuU3JjLCB0aGUgY29sb3Igd2hpdGUsIHRoZSBGb250IHNwZWNpZmllZCBpbiB0aGUK
ICAgICAgICAgICAgVGV4dFJlbmRlcmVyJ3MgY29uc3RydWN0b3IsIGFuZCB0aGUgcmVuZGVyaW5n
IGhpbnRzIHNwZWNpZmllZAogICAgICAgICAgICBpbiB0aGUgVGV4dFJlbmRlcmVyIGNvbnN0cnVj
dG9yLiAgQ2hhbmdlcyBtYWRlIGJ5IHRoZSBlbmQgdXNlcgogICAgICAgICAgICBtYXkgYmUgdmlz
aWJsZSBpbiBzdWNjZXNzaXZlIGNhbGxzIHRvIHRoaXMgbWV0aG9kLCBidXQgYXJlIG5vdAogICAg
ICAgICAgICBndWFyYW50ZWVkIHRvIGJlIHByZXNlcnZlZC4gIEltcGxlbWVudG9ycyBvZiB0aGlz
IG1ldGhvZAogICAgICAgICAgICBzaG91bGQgcmVzZXQgdGhlIEdyYXBoaWNzMkQncyBzdGF0ZSB0
byB0aGF0IGRlc2lyZWQgZWFjaCB0aW1lCiAgICAgICAgICAgIHRoaXMgbWV0aG9kIGlzIGNhbGxl
ZCwgaW4gcGFydGljdWxhciB0aG9zZSBzdGF0ZXMgd2hpY2ggYXJlCiAgICAgICAgICAgIG5vdCB0
aGUgZGVmYXVsdHMuICovCiAgICAgICAgcHVibGljIHZvaWQgZHJhdyhHcmFwaGljczJEIGdyYXBo
aWNzLCBTdHJpbmcgc3RyLCBpbnQgeCwgaW50IHkpOwoKICAgICAgICAvKiogUmVuZGVyIHRoZSBw
YXNzZWQgR2x5cGhWZWN0b3IgYXQgdGhlIGRlc2lnbmF0ZWQgbG9jYXRpb24gdXNpbmcKICAgICAg
ICAgICAgdGhlIHN1cHBsaWVkIEdyYXBoaWNzMkQgaW5zdGFuY2UuIFRoZSBzdXJyb3VuZGluZyBy
ZWdpb24gd2lsbAogICAgICAgICAgICBhbHJlYWR5IGhhdmUgYmVlbiBjbGVhcmVkIHRvIHRoZSBS
R0IgY29sb3IgKDAsIDAsIDApIHdpdGggemVybwogICAgICAgICAgICBhbHBoYS4gVGhlIGluaXRp
YWwgZHJhd2luZyBjb250ZXh0IG9mIHRoZSBwYXNzZWQgR3JhcGhpY3MyRAogICAgICAgICAgICB3
aWxsIGJlIHNldCB0byB1c2UgQWxwaGFDb21wb3NpdGUuU3JjLCB0aGUgY29sb3Igd2hpdGUsIHRo
ZQogICAgICAgICAgICBGb250IHNwZWNpZmllZCBpbiB0aGUgVGV4dFJlbmRlcmVyJ3MgY29uc3Ry
dWN0b3IsIGFuZCB0aGUKICAgICAgICAgICAgcmVuZGVyaW5nIGhpbnRzIHNwZWNpZmllZCBpbiB0
aGUgVGV4dFJlbmRlcmVyIGNvbnN0cnVjdG9yLgogICAgICAgICAgICBDaGFuZ2VzIG1hZGUgYnkg
dGhlIGVuZCB1c2VyIG1heSBiZSB2aXNpYmxlIGluIHN1Y2Nlc3NpdmUKICAgICAgICAgICAgY2Fs
bHMgdG8gdGhpcyBtZXRob2QsIGJ1dCBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VydmVk
LgogICAgICAgICAgICBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIHJlc2V0IHRo
ZSBHcmFwaGljczJEJ3MKICAgICAgICAgICAgc3RhdGUgdG8gdGhhdCBkZXNpcmVkIGVhY2ggdGlt
ZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGluCiAgICAgICAgICAgIHBhcnRpY3VsYXIgdGhvc2Ug
c3RhdGVzIHdoaWNoIGFyZSBub3QgdGhlIGRlZmF1bHRzLiAqLwogICAgICAgIHB1YmxpYyB2b2lk
IGRyYXdHbHlwaFZlY3RvcihHcmFwaGljczJEIGdyYXBoaWNzLCBHbHlwaFZlY3RvciBzdHIsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7CiAgICB9Cgog
ICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhclNlcXVlbmNlSXRlcmF0b3IgaW1wbGVtZW50cyBD
aGFyYWN0ZXJJdGVyYXRvciB7CiAgICAgICAgQ2hhclNlcXVlbmNlIG1TZXF1ZW5jZTsKICAgICAg
ICBpbnQgbUxlbmd0aDsKICAgICAgICBpbnQgbUN1cnJlbnRJbmRleDsKCiAgICAgICAgQ2hhclNl
cXVlbmNlSXRlcmF0b3IoKSB7CiAgICAgICAgfQoKICAgICAgICBDaGFyU2VxdWVuY2VJdGVyYXRv
cihDaGFyU2VxdWVuY2Ugc2VxdWVuY2UpIHsKICAgICAgICAgICAgaW5pdEZyb21DaGFyU2VxdWVu
Y2Uoc2VxdWVuY2UpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgaW5pdEZyb21DaGFy
U2VxdWVuY2UoQ2hhclNlcXVlbmNlIHNlcXVlbmNlKSB7CiAgICAgICAgICAgIG1TZXF1ZW5jZSA9
IHNlcXVlbmNlOwogICAgICAgICAgICBtTGVuZ3RoID0gbVNlcXVlbmNlLmxlbmd0aCgpOwogICAg
ICAgICAgICBtQ3VycmVudEluZGV4ID0gMDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBjaGFy
IGxhc3QoKSB7CiAgICAgICAgICAgIG1DdXJyZW50SW5kZXggPSBNYXRoLm1heCgwLCBtTGVuZ3Ro
IC0gMSk7CgogICAgICAgICAgICByZXR1cm4gY3VycmVudCgpOwogICAgICAgIH0KCiAgICAgICAg
cHVibGljIGNoYXIgY3VycmVudCgpIHsKICAgICAgICAgICAgaWYgKChtTGVuZ3RoID09IDApIHx8
IChtQ3VycmVudEluZGV4ID49IG1MZW5ndGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQ2hh
cmFjdGVySXRlcmF0b3IuRE9ORTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1T
ZXF1ZW5jZS5jaGFyQXQobUN1cnJlbnRJbmRleCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMg
Y2hhciBuZXh0KCkgewogICAgICAgICAgICBtQ3VycmVudEluZGV4Kys7CgogICAgICAgICAgICBy
ZXR1cm4gY3VycmVudCgpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGNoYXIgcHJldmlvdXMo
KSB7CiAgICAgICAgICAgIG1DdXJyZW50SW5kZXggPSBNYXRoLm1heChtQ3VycmVudEluZGV4IC0g
MSwgMCk7CgogICAgICAgICAgICByZXR1cm4gY3VycmVudCgpOwogICAgICAgIH0KCiAgICAgICAg
cHVibGljIGNoYXIgc2V0SW5kZXgoaW50IHBvc2l0aW9uKSB7CiAgICAgICAgICAgIG1DdXJyZW50
SW5kZXggPSBwb3NpdGlvbjsKCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50KCk7CiAgICAgICAg
fQoKICAgICAgICBwdWJsaWMgaW50IGdldEJlZ2luSW5kZXgoKSB7CiAgICAgICAgICAgIHJldHVy
biAwOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBnZXRFbmRJbmRleCgpIHsKICAgICAg
ICAgICAgcmV0dXJuIG1MZW5ndGg7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgaW50IGdldElu
ZGV4KCkgewogICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRJbmRleDsKICAgICAgICB9CgogICAg
ICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgICAgIENoYXJTZXF1ZW5jZUl0ZXJh
dG9yIGl0ZXIgPSBuZXcgQ2hhclNlcXVlbmNlSXRlcmF0b3IobVNlcXVlbmNlKTsKICAgICAgICAg
ICAgaXRlci5tQ3VycmVudEluZGV4ID0gbUN1cnJlbnRJbmRleDsKCiAgICAgICAgICAgIHJldHVy
biBpdGVyOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGNoYXIgZmlyc3QoKSB7CiAgICAgICAg
ICAgIGlmIChtTGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBDaGFyYWN0ZXJJ
dGVyYXRvci5ET05FOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtQ3VycmVudEluZGV4ID0g
MDsKCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50KCk7CiAgICAgICAgfQogICAgfQoKICAgIC8v
IERhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcmVjdGFuZ2xlIG9mIHRleHQKICAgIHN0YXRpYyBj
bGFzcyBUZXh0RGF0YSB7CiAgICAgICAgLy8gQmFjay1wb2ludGVyIHRvIFN0cmluZyB0aGlzIFRl
eHREYXRhIGRlc2NyaWJlcywgaWYgaXQKICAgICAgICAvLyByZXByZXNlbnRzIGEgU3RyaW5nIHJh
dGhlciB0aGFuIGEgc2luZ2xlIGdseXBoCiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyOwoKICAg
ICAgICAvLyBJZiB0aGlzIFRleHREYXRhIHJlcHJlc2VudHMgYSBzaW5nbGUgZ2x5cGgsIHRoaXMg
aXMgaXRzCiAgICAgICAgLy8gdW5pY29kZSBJRAogICAgICAgIGludCB1bmljb2RlSUQ7CgogICAg
ICAgIC8vIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBkZWZpbmVkIGFuZCB1c2VkIFZFUlkgcHJlY2lz
ZWx5LiBUaGlzIGlzCiAgICAgICAgLy8gdGhlIG9mZnNldCBmcm9tIHRoZSB1cHBlci1sZWZ0IGNv
cm5lciBvZiB0aGlzIHJlY3RhbmdsZSAoSmF2YQogICAgICAgIC8vIDJEIGNvb3JkaW5hdGUgc3lz
dGVtKSBhdCB3aGljaCB0aGUgc3RyaW5nIG11c3QgYmUgcmFzdGVyaXplZCBpbgogICAgICAgIC8v
IG9yZGVyIHRvIGZpdCB3aXRoaW4gdGhlIHJlY3RhbmdsZSAtLSB0aGUgbGVmdG1vc3QgcG9pbnQg
b2YgdGhlCiAgICAgICAgLy8gYmFzZWxpbmUuCiAgICAgICAgcHJpdmF0ZSBQb2ludCBvcmlnaW47
CgogICAgICAgIC8vIFRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLW5vcm1hbGl6ZWQgcmVjdGFuZ2xl
LCB3aGljaCBmaXRzCiAgICAgICAgLy8gd2l0aGluIHRoZSByZWN0YW5nbGUgb24gdGhlIGJhY2tp
bmcgc3RvcmUuIFdlIGtlZXAgYQogICAgICAgIC8vIG9uZS1waXhlbCBib3JkZXIgYXJvdW5kIGVu
dHJpZXMgb24gdGhlIGJhY2tpbmcgc3RvcmUgdG8KICAgICAgICAvLyBwcmV2ZW50IGJsZWVkaW5n
IG9mIGFkamFjZW50IGxldHRlcnMgd2hlbiB1c2luZyBHTF9MSU5FQVIKICAgICAgICAvLyBmaWx0
ZXJpbmcgZm9yIHJlbmRlcmluZy4gVGhlIG9yaWdpbiBvZiB0aGlzIHJlY3RhbmdsZSBpcwogICAg
ICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbiBhYm92ZS4KICAgICAgICBwcml2YXRlIFJl
Y3RhbmdsZTJEIG9yaWdSZWN0OwoKICAgICAgICBwcml2YXRlIGJvb2xlYW4gdXNlZDsgLy8gV2hl
dGhlciB0aGlzIHRleHQgd2FzIHVzZWQgcmVjZW50bHkKCiAgICAgICAgVGV4dERhdGEoU3RyaW5n
IHN0ciwgUG9pbnQgb3JpZ2luLCBSZWN0YW5nbGUyRCBvcmlnUmVjdCwgaW50IHVuaWNvZGVJRCkg
ewogICAgICAgICAgICB0aGlzLnN0ciA9IHN0cjsKICAgICAgICAgICAgdGhpcy5vcmlnaW4gPSBv
cmlnaW47CiAgICAgICAgICAgIHRoaXMub3JpZ1JlY3QgPSBvcmlnUmVjdDsKICAgICAgICAgICAg
dGhpcy51bmljb2RlSUQgPSB1bmljb2RlSUQ7CiAgICAgICAgfQoKICAgICAgICBTdHJpbmcgc3Ry
aW5nKCkgewogICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgIH0KCiAgICAgICAgUG9pbnQg
b3JpZ2luKCkgewogICAgICAgICAgICByZXR1cm4gb3JpZ2luOwogICAgICAgIH0KCiAgICAgICAg
Ly8gVGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzIGFyZSB1c2VkIHRvIGxvY2F0ZSB0aGUgZ2x5
cGgKICAgICAgICAvLyB3aXRoaW4gdGhlIGV4cGFuZGVkIHJlY3RhbmdsZSBjb21pbmcgZnJvbSBu
b3JtYWxpemUoKQogICAgICAgIGludCBvcmlnT3JpZ2luWCgpIHsKICAgICAgICAgICAgcmV0dXJu
IChpbnQpIC1vcmlnUmVjdC5nZXRNaW5YKCk7CiAgICAgICAgfQoKICAgICAgICBpbnQgb3JpZ09y
aWdpblkoKSB7CiAgICAgICAgICAgIHJldHVybiAoaW50KSAtb3JpZ1JlY3QuZ2V0TWluWSgpOwog
ICAgICAgIH0KCiAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QoKSB7CiAgICAgICAgICAgIHJl
dHVybiBvcmlnUmVjdDsKICAgICAgICB9CgogICAgICAgIGJvb2xlYW4gdXNlZCgpIHsKICAgICAg
ICAgICAgcmV0dXJuIHVzZWQ7CiAgICAgICAgfQoKICAgICAgICB2b2lkIG1hcmtVc2VkKCkgewog
ICAgICAgICAgICB1c2VkID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHZvaWQgY2xlYXJVc2Vk
KCkgewogICAgICAgICAgICB1c2VkID0gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIGNsYXNz
IE1hbmFnZXIgaW1wbGVtZW50cyBCYWNraW5nU3RvcmVNYW5hZ2VyIHsKICAgICAgICBwcml2YXRl
IEdyYXBoaWNzMkQgZzsKCiAgICAgICAgcHVibGljIE9iamVjdCBhbGxvY2F0ZUJhY2tpbmdTdG9y
ZShpbnQgdywgaW50IGgpIHsKICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBjb25zaWRlciBj
aGVja2luZyBGb250J3MgYXR0cmlidXRlcyB0byBzZWUKICAgICAgICAgICAgLy8gd2hldGhlciB3
ZSdyZSBsaWtlbHkgdG8gbmVlZCB0byBzdXBwb3J0IGEgZnVsbCBSR0JBIGJhY2tpbmcKICAgICAg
ICAgICAgLy8gc3RvcmUgKGkuZS4sIG5vbi1kZWZhdWx0IFBhaW50LCBmb3JlZ3JvdW5kIGNvbG9y
LCBldGMuKSwgYnV0CiAgICAgICAgICAgIC8vIGZvciBub3csIGxldCdzIGp1c3QgYmUgbW9yZSBl
ZmZpY2llbnQKICAgICAgICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRlcmVyOwoKICAgICAgICAg
ICAgaWYgKHJlbmRlckRlbGVnYXRlLmludGVuc2l0eU9ubHkoKSkgewogICAgICAgICAgICAgICAg
cmVuZGVyZXIgPSBUZXh0dXJlUmVuZGVyZXIuY3JlYXRlQWxwaGFPbmx5UmVuZGVyZXIodywgaCwg
bWlwbWFwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlbmRlcmVyID0g
bmV3IFRleHR1cmVSZW5kZXJlcih3LCBoLCB0cnVlLCBtaXBtYXApOwogICAgICAgICAgICB9CiAg
ICAgICAgICAgIHJlbmRlcmVyLnNldFNtb290aGluZyhzbW9vdGhpbmcpOwoKICAgICAgICAgICAg
aWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiBUZXh0UmVu
ZGVyZXIgYWxsb2NhdGluZyBiYWNraW5nIHN0b3JlICIgKwogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHcgKyAiIHggIiArIGgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBy
ZXR1cm4gcmVuZGVyZXI7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGVCYWNr
aW5nU3RvcmUoT2JqZWN0IGJhY2tpbmdTdG9yZSkgewogICAgICAgICAgICAoKFRleHR1cmVSZW5k
ZXJlcikgYmFja2luZ1N0b3JlKS5kaXNwb3NlKCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMg
Ym9vbGVhbiBwcmVFeHBhbmQoUmVjdCBjYXVzZSwgaW50IGF0dGVtcHROdW1iZXIpIHsKICAgICAg
ICAgICAgLy8gT25seSB0cnkgdGhpcyBvbmUgdGltZTsgY2xlYXIgb3V0IHBvdGVudGlhbGx5IG9i
c29sZXRlIGVudHJpZXMKICAgICAgICAgICAgLy8gTk9URTogdGhpcyBoZXVyaXN0aWMgYW5kIHRo
ZSBmYWN0IHRoYXQgaXQgY2xlYXJzIHRoZSB1c2VkIGJpdAogICAgICAgICAgICAvLyBvZiBhbGwg
ZW50cmllcyBzZWVtcyB0byBjYXVzZSBjeWNsaW5nIG9mIGVudHJpZXMgaW4gc29tZQogICAgICAg
ICAgICAvLyBzaXR1YXRpb25zLCB3aGVyZSB0aGUgYmFja2luZyBzdG9yZSBiZWNvbWVzIHNtYWxs
IGNvbXBhcmVkIHRvCiAgICAgICAgICAgIC8vIHRoZSBhbW91bnQgb2YgdGV4dCBvbiB0aGUgc2Ny
ZWVuIChzZWUgdGhlIFRleHRGbG93IGRlbW8pIGFuZAogICAgICAgICAgICAvLyB0aGUgZW50cmll
cyBjb250aW51YWxseSBjeWNsZSBpbiBhbmQgb3V0IG9mIHRoZSBiYWNraW5nCiAgICAgICAgICAg
IC8vIHN0b3JlLCBkZWNyZWFzaW5nIHBlcmZvcm1hbmNlLiBJZiB3ZSBhZGRlZCBhIGxpdHRsZSBh
Z2UKICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gdG8gdGhlIGVudHJpZXMsIGFuZCBvbmx5IGNs
ZWFyZWQgb3V0IGVudHJpZXMKICAgICAgICAgICAgLy8gYWJvdmUgYSBjZXJ0YWluIGFnZSwgdGhp
cyBiZWhhdmlvciB3b3VsZCBiZSBlbGltaW5hdGVkLgogICAgICAgICAgICAvLyBIb3dldmVyLCBp
dCBzZWVtcyB0aGUgc3lzdGVtIHVzdWFsbHkgc3RhYmlsaXplcyBpdHNlbGYsIHNvCiAgICAgICAg
ICAgIC8vIGZvciBub3cgd2UnbGwganVzdCBrZWVwIHRoaW5ncyBzaW1wbGUuIE5vdGUgdGhhdCBp
ZiB3ZSBkb24ndAogICAgICAgICAgICAvLyBjbGVhciB0aGUgdXNlZCBiaXQgaGVyZSwgdGhlIGJh
Y2tpbmcgc3RvcmUgdGVuZHMgdG8gaW5jcmVhc2UKICAgICAgICAgICAgLy8gdmVyeSBxdWlja2x5
IHRvIGl0cyBtYXhpbXVtIHNpemUsIGF0IGxlYXN0IHdpdGggdGhlIFRleHRGbG93CiAgICAgICAg
ICAgIC8vIGRlbW8gd2hlbiB0aGUgdGV4dCBpcyBiZWluZyBjb250aW51YWxseSByZS1sYWlkIG91
dC4KICAgICAgICAgICAgaWYgKGF0dGVtcHROdW1iZXIgPT0gMCkgewogICAgICAgICAgICAgICAg
aWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAogICAg
ICAgICAgICAgICAgICAgICAgICAiQ2xlYXJpbmcgdW51c2VkIGVudHJpZXMgaW4gcHJlRXhwYW5k
KCk6IGF0dGVtcHQgbnVtYmVyICIgKwogICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0TnVt
YmVyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaW5CZWdpbkVuZFBh
aXIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBEcmF3IGFueSBvdXRzdGFuZGluZyBnbHlwaHMK
ICAgICAgICAgICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAg
ICAgICAgIGNsZWFyVW51c2VkRW50cmllcygpOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAg
ICAgICBwdWJsaWMgdm9pZCBhZGRpdGlvbkZhaWxlZChSZWN0IGNhdXNlLCBpbnQgYXR0ZW1wdE51
bWJlcikgewogICAgICAgICAgICAvLyBIZWF2eSBoYW1tZXIgLS0gbWlnaHQgY29uc2lkZXIgZG9p
bmcgc29tZXRoaW5nIGRpZmZlcmVudAogICAgICAgICAgICBwYWNrZXIuY2xlYXIoKTsKICAgICAg
ICAgICAgc3RyaW5nTG9jYXRpb25zLmNsZWFyKCk7CiAgICAgICAgICAgIG1HbHlwaFByb2R1Y2Vy
LmNsZWFyQWxsQ2FjaGVFbnRyaWVzKCk7CgogICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAg
ICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiICoqKiBDbGVhcmVkIGFsbCB0ZXh0IGJlY2F1c2UgYWRkaXRpb24gZmFpbGVkICoq
KiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBiZWdpbk1v
dmVtZW50KE9iamVjdCBvbGRCYWNraW5nU3RvcmUsIE9iamVjdCBuZXdCYWNraW5nU3RvcmUpIHsK
ICAgICAgICAgICAgLy8gRXhpdCB0aGUgYmVnaW4gLyBlbmQgcGFpciBpZiBuZWNlc3NhcnkKICAg
ICAgICAgICAgaWYgKGluQmVnaW5FbmRQYWlyKSB7CiAgICAgICAgICAgICAgICAvLyBEcmF3IGFu
eSBvdXRzdGFuZGluZyBnbHlwaHMKICAgICAgICAgICAgICAgIGZsdXNoKCk7CgogICAgICAgICAg
ICAgICAgR0wgZ2wgPSBHTFUuZ2V0Q3VycmVudEdMKCk7CgogICAgICAgICAgICAgICAgLy8gUG9w
IGNsaWVudCBhdHRyaWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgog
ICAgICAgICAgICAgICAgZ2wuZ2xQb3BDbGllbnRBdHRyaWIoKTsKCiAgICAgICAgICAgICAgICAv
LyBUaGUgT3BlbkdMIHNwZWMgaXMgdW5jbGVhciBhYm91dCB3aGV0aGVyIHRoaXMgY2hhbmdlcyB0
aGUKICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBiaW5kaW5ncywgc28gcHJlZW1wdGl2ZWx5IHpl
cm8gb3V0IHRoZSBHTF9BUlJBWV9CVUZGRVIKICAgICAgICAgICAgICAgIC8vIGJpbmRpbmcKICAg
ICAgICAgICAgICAgIGlmIChpczE1QXZhaWxhYmxlKGdsKSkgewogICAgICAgICAgICAgICAgICAg
IHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJB
WV9CVUZGRVIsIDApOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7
CiAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZW5zaW9uQXZhaWxhYmxlX0dMX1ZFUlNJT05f
MV81ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAg
ICAgICAgICAgICAgIGlmIChpc09ydGhvTW9kZSkgewogICAgICAgICAgICAgICAgICAgICgoVGV4
dHVyZVJlbmRlcmVyKSBvbGRCYWNraW5nU3RvcmUpLmVuZE9ydGhvUmVuZGVyaW5nKCk7CiAgICAg
ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICgoVGV4dHVyZVJlbmRlcmVy
KSBvbGRCYWNraW5nU3RvcmUpLmVuZDNEUmVuZGVyaW5nKCk7CiAgICAgICAgICAgICAgICB9CiAg
ICAgICAgICAgIH0KCiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBuZXdSZW5kZXJlciA9IChU
ZXh0dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZTsKICAgICAgICAgICAgZyA9IG5ld1JlbmRl
cmVyLmNyZWF0ZUdyYXBoaWNzKCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBtb3Zl
KE9iamVjdCBvbGRCYWNraW5nU3RvcmUsIFJlY3Qgb2xkTG9jYXRpb24sCiAgICAgICAgICAgICAg
ICAgICAgICAgICBPYmplY3QgbmV3QmFja2luZ1N0b3JlLCBSZWN0IG5ld0xvY2F0aW9uKSB7CiAg
ICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBvbGRSZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIp
IG9sZEJhY2tpbmdTdG9yZTsKICAgICAgICAgICAgVGV4dHVyZVJlbmRlcmVyIG5ld1JlbmRlcmVy
ID0gKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlOwoKICAgICAgICAgICAgaWYgKG9s
ZFJlbmRlcmVyID09IG5ld1JlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAvLyBNb3ZlbWVudCBv
biB0aGUgc2FtZSBiYWNraW5nIHN0b3JlIC0tIGVhc3kgY2FzZQogICAgICAgICAgICAgICAgZy5j
b3B5QXJlYShvbGRMb2NhdGlvbi54KCksIG9sZExvY2F0aW9uLnkoKSwgb2xkTG9jYXRpb24udygp
LAogICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2NhdGlvbi5oKCksIG5ld0xvY2F0aW9u
LngoKSAtIG9sZExvY2F0aW9uLngoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TG9j
YXRpb24ueSgpIC0gb2xkTG9jYXRpb24ueSgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgICAgICAgIC8vIE5lZWQgdG8gZHJhdyBmcm9tIHRoZSBvbGQgcmVuZGVyZXIncyBpbWFnZSBp
bnRvIHRoZSBuZXcgb25lCiAgICAgICAgICAgICAgICBJbWFnZSBpbWcgPSBvbGRSZW5kZXJlci5n
ZXRJbWFnZSgpOwogICAgICAgICAgICAgICAgZy5kcmF3SW1hZ2UoaW1nLCBuZXdMb2NhdGlvbi54
KCksIG5ld0xvY2F0aW9uLnkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xvY2F0
aW9uLngoKSArIG5ld0xvY2F0aW9uLncoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5l
d0xvY2F0aW9uLnkoKSArIG5ld0xvY2F0aW9uLmgoKSwgb2xkTG9jYXRpb24ueCgpLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgb2xkTG9jYXRpb24ueSgpLCBvbGRMb2NhdGlvbi54KCkgKyBv
bGRMb2NhdGlvbi53KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2NhdGlvbi55
KCkgKyBvbGRMb2NhdGlvbi5oKCksIG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAg
ICAgICBwdWJsaWMgdm9pZCBlbmRNb3ZlbWVudChPYmplY3Qgb2xkQmFja2luZ1N0b3JlLCBPYmpl
Y3QgbmV3QmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgIGcuZGlzcG9zZSgpOwoKICAgICAgICAg
ICAgLy8gU3luYyB0aGUgd2hvbGUgc3VyZmFjZQogICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIg
bmV3UmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBuZXdCYWNraW5nU3RvcmU7CiAgICAgICAg
ICAgIG5ld1JlbmRlcmVyLm1hcmtEaXJ0eSgwLCAwLCBuZXdSZW5kZXJlci5nZXRXaWR0aCgpLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVuZGVyZXIuZ2V0SGVpZ2h0KCkp
OwoKICAgICAgICAgICAgLy8gUmUtZW50ZXIgdGhlIGJlZ2luIC8gZW5kIHBhaXIgaWYgbmVjZXNz
YXJ5CiAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewogICAgICAgICAgICAgICAgaWYg
KGlzT3J0aG9Nb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgKChUZXh0dXJlUmVuZGVyZXIpIG5l
d0JhY2tpbmdTdG9yZSkuYmVnaW5PcnRob1JlbmRlcmluZyhiZWdpblJlbmRlcmluZ1dpZHRoLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYmVnaW5SZW5kZXJpbmdIZWlnaHQsIGJlZ2luUmVuZGVyaW5nRGVw
dGhUZXN0RGlzYWJsZWQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAg
ICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5iZWdpbjNEUmVuZGVyaW5n
KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gUHVzaCBjbGllbnQgYXR0
cmliIGJpdHMgdXNlZCBieSB0aGUgcGlwZWxpbmVkIHF1YWQgcmVuZGVyZXIKICAgICAgICAgICAg
ICAgIEdMIGdsID0gR0xVLmdldEN1cnJlbnRHTCgpOwogICAgICAgICAgICAgICAgZ2wuZ2xQdXNo
Q2xpZW50QXR0cmliKChpbnQpIEdMLkdMX0FMTF9DTElFTlRfQVRUUklCX0JJVFMpOwoKICAgICAg
ICAgICAgICAgIGlmIChoYXZlQ2FjaGVkQ29sb3IpIHsKICAgICAgICAgICAgICAgICAgICBpZiAo
Y2FjaGVkQ29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVS
ZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRSLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
YWNoZWRHLCBjYWNoZWRCLCBjYWNoZWRBKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugewog
ICAgICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3Jl
KS5zZXRDb2xvcihjYWNoZWRDb2xvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmVlZFRvUmVzZXRD
b2xvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0
YXRpYyBjbGFzcyBEZWZhdWx0UmVuZGVyRGVsZWdhdGUgaW1wbGVtZW50cyBSZW5kZXJEZWxlZ2F0
ZSB7CiAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZW5zaXR5T25seSgpIHsKICAgICAgICAgICAg
cmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91
bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICAgICByZXR1cm4g
Z2V0Qm91bmRzKGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJTZXF1ZW5jZUl0ZXJhdG9y
KHN0cikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYyk7CiAgICAgICAgfQoKICAg
ICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKFN0cmluZyBzdHIsIEZvbnQgZm9udCwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZy
YykgewogICAgICAgICAgICByZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3JlYXRlR2x5cGhWZWN0b3Io
ZnJjLCBzdHIpLCBmcmMpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdl
dEJvdW5kcyhHbHlwaFZlY3RvciBndiwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAgICAgICAg
ICAgIHJldHVybiBndi5nZXRWaXN1YWxCb3VuZHMoKTsKICAgICAgICB9CgogICAgICAgIHB1Ymxp
YyB2b2lkIGRyYXdHbHlwaFZlY3RvcihHcmFwaGljczJEIGdyYXBoaWNzLCBHbHlwaFZlY3RvciBz
dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSkgewog
ICAgICAgICAgICBncmFwaGljcy5kcmF3R2x5cGhWZWN0b3Ioc3RyLCB4LCB5KTsKICAgICAgICB9
CgogICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3MyRCBncmFwaGljcywgU3RyaW5nIHN0
ciwgaW50IHgsIGludCB5KSB7CiAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdTdHJpbmcoc3RyLCB4
LCB5KTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBHbHlwaC1i
eS1nbHlwaCByZW5kZXJpbmcgc3VwcG9ydAogICAgLy8KCiAgICAvLyBBIHRlbXBvcmFyeSB0byBw
cmV2ZW50IGV4Y2Vzc2l2ZSBnYXJiYWdlIGNyZWF0aW9uCiAgICBwcml2YXRlIGNoYXJbXSBzaW5n
bGVVbmljb2RlID0gbmV3IGNoYXJbMV07CgogICAgLyoqIEEgR2x5cGggcmVwcmVzZW50cyBlaXRo
ZXIgYSBzaW5nbGUgdW5pY29kZSBnbHlwaCBvciBhCiAgICAgICAgc3Vic3RyaW5nIG9mIGNoYXJh
Y3RlcnMgdG8gYmUgZHJhd24uIFRoZSByZWFzb24gZm9yIHRoZSBkdWFsCiAgICAgICAgYmVoYXZp
b3IgaXMgc28gdGhhdCB3ZSBjYW4gdGFrZSBpbiBhIHNlcXVlbmNlIG9mIHVuaWNvZGUKICAgICAg
ICBjaGFyYWN0ZXJzIGFuZCBwYXJ0aXRpb24gdGhlbSBpbnRvIHJ1bnMgb2YgaW5kaXZpZHVhbCBn
bHlwaHMsCiAgICAgICAgYnV0IGlmIHdlIGVuY291bnRlciBjb21wbGV4IHRleHQgYW5kL29yIHVu
aWNvZGUgc2VxdWVuY2VzIHdlCiAgICAgICAgZG9uJ3QgdW5kZXJzdGFuZCwgd2UgY2FuIHJlbmRl
ciB0aGVtIHVzaW5nIHRoZQogICAgICAgIHN0cmluZy1ieS1zdHJpbmcgbWV0aG9kLiA8UD4KCiAg
ICAgICAgR2x5cGhzIG5lZWQgdG8gYmUgYWJsZSB0byByZS11cGxvYWQgdGhlbXNlbHZlcyB0byB0
aGUgYmFja2luZwogICAgICAgIHN0b3JlIG9uIGRlbWFuZCBhcyB3ZSBnbyBhbG9uZyBpbiB0aGUg
cmVuZGVyIHNlcXVlbmNlLgogICAgKi8KCiAgICBjbGFzcyBHbHlwaCB7CiAgICAgICAgLy8gSWYg
dGhpcyBHbHlwaCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdW5pY29kZSBnbHlwaCwgdGhpcwog
ICAgICAgIC8vIGlzIGl0cyB1bmljb2RlIElELiBJZiBpdCByZXByZXNlbnRzIGEgU3RyaW5nLCB0
aGlzIGlzIC0xLgogICAgICAgIHByaXZhdGUgaW50IHVuaWNvZGVJRDsKICAgICAgICAvLyBJZiB0
aGUgYWJvdmUgZmllbGQgaXNuJ3QgLTEsIHRoZW4gdGhlc2UgZmllbGRzIGFyZSB1c2VkLgogICAg
ICAgIC8vIFRoZSBnbHlwaCBjb2RlIGluIHRoZSBmb250CiAgICAgICAgcHJpdmF0ZSBpbnQgZ2x5
cGhDb2RlOwogICAgICAgIC8vIFRoZSBHbHlwaFByb2R1Y2VyIHdoaWNoIGNyZWF0ZWQgdXMKICAg
ICAgICBwcml2YXRlIEdseXBoUHJvZHVjZXIgcHJvZHVjZXI7CiAgICAgICAgLy8gVGhlIGFkdmFu
Y2Ugb2YgdGhpcyBnbHlwaAogICAgICAgIHByaXZhdGUgZmxvYXQgYWR2YW5jZTsKICAgICAgICAv
LyBUaGUgR2x5cGhWZWN0b3IgZm9yIHRoaXMgc2luZ2xlIGNoYXJhY3RlcjsgdGhpcyBpcyBwYXNz
ZWQKICAgICAgICAvLyBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGJ1dCBjbGVhcmVkIGR1cmluZyB0
aGUgdXBsb2FkCiAgICAgICAgLy8gcHJvY2VzcwogICAgICAgIHByaXZhdGUgR2x5cGhWZWN0b3Ig
c2luZ2xlVW5pY29kZUdseXBoVmVjdG9yOwogICAgICAgIC8vIFRoZSByZWN0YW5nbGUgb2YgdGhp
cyBnbHlwaCBvbiB0aGUgYmFja2luZyBzdG9yZSwgb3IgbnVsbAogICAgICAgIC8vIGlmIGl0IGhh
cyBiZWVuIGNsZWFyZWQgZHVlIHRvIHNwYWNlIHByZXNzdXJlCiAgICAgICAgcHJpdmF0ZSBSZWN0
IGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nOwogICAgICAgIC8vIElmIHRoaXMgR2x5cGggcmVw
cmVzZW50cyBhIFN0cmluZywgdGhpcyBpcyB0aGUgc2VxdWVuY2Ugb2YKICAgICAgICAvLyBjaGFy
YWN0ZXJzCiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyOwogICAgICAgIC8vIFdoZXRoZXIgd2Ug
bmVlZCBhIHZhbGlkIGFkdmFuY2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBzdHJpbmcKICAgICAgICAv
LyAoaS5lLiwgd2hldGhlciBpdCBoYXMgb3RoZXIgc2luZ2xlIGdseXBocyBjb21pbmcgYWZ0ZXIg
aXQpCiAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRBZHZhbmNlOwoKICAgICAgICAvLyBDcmVh
dGVzIGEgR2x5cGggcmVwcmVzZW50aW5nIGFuIGluZGl2aWR1YWwgVW5pY29kZSBjaGFyYWN0ZXIK
ICAgICAgICBwdWJsaWMgR2x5cGgoaW50IHVuaWNvZGVJRCwKICAgICAgICAgICAgICAgICAgICAg
aW50IGdseXBoQ29kZSwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWR2YW5jZSwKICAgICAg
ICAgICAgICAgICAgICAgR2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUdseXBoVmVjdG9yLAogICAg
ICAgICAgICAgICAgICAgICBHbHlwaFByb2R1Y2VyIHByb2R1Y2VyKSB7CiAgICAgICAgICAgIHRo
aXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAgICAgICAgICB0aGlzLmdseXBoQ29kZSA9IGds
eXBoQ29kZTsKICAgICAgICAgICAgdGhpcy5hZHZhbmNlID0gYWR2YW5jZTsKICAgICAgICAgICAg
dGhpcy5zaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IgPSBzaW5nbGVVbmljb2RlR2x5cGhWZWN0b3I7
CiAgICAgICAgICAgIHRoaXMucHJvZHVjZXIgPSBwcm9kdWNlcjsKICAgICAgICB9CgogICAgICAg
IC8vIENyZWF0ZXMgYSBHbHlwaCByZXByZXNlbnRpbmcgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJz
LCB3aXRoCiAgICAgICAgLy8gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIGFkZGl0aW9uYWwgc2lu
Z2xlIGdseXBocyBhcmUgYmVpbmcKICAgICAgICAvLyByZW5kZXJlZCBhZnRlciBpdAogICAgICAg
IHB1YmxpYyBHbHlwaChTdHJpbmcgc3RyLCBib29sZWFuIG5lZWRBZHZhbmNlKSB7CiAgICAgICAg
ICAgIHRoaXMuc3RyID0gc3RyOwogICAgICAgICAgICB0aGlzLm5lZWRBZHZhbmNlID0gbmVlZEFk
dmFuY2U7CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGlzIGdseXBoJ3MgdW5pY29k
ZSBJRCAqLwogICAgICAgIHB1YmxpYyBpbnQgZ2V0VW5pY29kZUlEKCkgewogICAgICAgICAgICBy
ZXR1cm4gdW5pY29kZUlEOwogICAgICAgIH0KCiAgICAgICAgLyoqIFJldHVybnMgdGhpcyBnbHlw
aCdzIChmb250LXNwZWNpZmljKSBnbHlwaCBjb2RlICovCiAgICAgICAgcHVibGljIGludCBnZXRH
bHlwaENvZGUoKSB7CiAgICAgICAgICAgIHJldHVybiBnbHlwaENvZGU7CiAgICAgICAgfQoKICAg
ICAgICAvKiogUmV0dXJucyB0aGUgYWR2YW5jZSBmb3IgdGhpcyBnbHlwaCAqLwogICAgICAgIHB1
YmxpYyBmbG9hdCBnZXRBZHZhbmNlKCkgewogICAgICAgICAgICByZXR1cm4gYWR2YW5jZTsKICAg
ICAgICB9CgogICAgICAgIC8qKiBEcmF3cyB0aGlzIGdseXBoIGFuZCByZXR1cm5zIHRoZSAoeCkg
YWR2YW5jZSBmb3IgdGhpcyBnbHlwaCAqLwogICAgICAgIHB1YmxpYyBmbG9hdCBkcmF3M0QoZmxv
YXQgaW5YLCBmbG9hdCBpblksIGZsb2F0IHosIGZsb2F0IHNjYWxlRmFjdG9yKSB7CiAgICAgICAg
ICAgIGlmIChzdHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgZHJhdzNEX1JPQlVTVChzdHIs
IGluWCwgaW5ZLCB6LCBzY2FsZUZhY3Rvcik7CiAgICAgICAgICAgICAgICBpZiAoIW5lZWRBZHZh
bmNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAg
ICAgICAgICAgICAgICAvLyBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGFkdmFuY2UgZm9yIHRoaXMg
c3RyaW5nCiAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBndiA9IGZvbnQuY3JlYXRlR2x5cGhW
ZWN0b3IoZ2V0Rm9udFJlbmRlckNvbnRleHQoKSwgc3RyKTsKICAgICAgICAgICAgICAgIGZsb2F0
IHRvdGFsQWR2YW5jZSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGd2
LmdldE51bUdseXBocygpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB0b3RhbEFkdmFuY2Ug
Kz0gZ3YuZ2V0R2x5cGhNZXRyaWNzKGkpLmdldEFkdmFuY2UoKTsKICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CiAgICAgICAgICAgIH0KCiAgICAg
ICAgICAgIC8vIFRoaXMgaXMgdGhlIGNvZGUgcGF0aCB0YWtlbiBmb3IgaW5kaXZpZHVhbCBnbHlw
aHMKICAgICAgICAgICAgaWYgKGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nID09IG51bGwpIHsK
ICAgICAgICAgICAgICAgIHVwbG9hZCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0cnkg
ewogICAgICAgICAgICAgICAgaWYgKG1QaXBlbGluZWRRdWFkUmVuZGVyZXIgPT0gbnVsbCkgewog
ICAgICAgICAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIgPSBuZXcgUGlwZWxpbmVk
X1F1YWRSZW5kZXJlcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIFRleHR1
cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tpbmdTdG9yZSgpOwogICAgICAgICAgICAgICAg
Ly8gSGFuZGxlcyBjYXNlIHdoZXJlIE5QT1QgdGV4dHVyZSBpcyB1c2VkIGZvciBiYWNraW5nIHN0
b3JlCiAgICAgICAgICAgICAgICBUZXh0dXJlQ29vcmRzIHdob2xlSW1hZ2VUZXhDb29yZHMgPSBy
ZW5kZXJlci5nZXRUZXh0dXJlKCkuZ2V0SW1hZ2VUZXhDb29yZHMoKTsKICAgICAgICAgICAgICAg
IGZsb2F0IHhTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMucmlnaHQoKTsKICAgICAgICAgICAg
ICAgIGZsb2F0IHlTY2FsZSA9IHdob2xlSW1hZ2VUZXhDb29yZHMuYm90dG9tKCk7CgogICAgICAg
ICAgICAgICAgUmVjdCByZWN0ID0gZ2x5cGhSZWN0Rm9yVGV4dHVyZU1hcHBpbmc7CiAgICAgICAg
ICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRleHREYXRhKSByZWN0LmdldFVzZXJEYXRhKCk7CiAg
ICAgICAgICAgICAgICBkYXRhLm1hcmtVc2VkKCk7CgogICAgICAgICAgICAgICAgUmVjdGFuZ2xl
MkQgb3JpZ1JlY3QgPSBkYXRhLm9yaWdSZWN0KCk7CgogICAgICAgICAgICAgICAgZmxvYXQgeCA9
IGluWCAtIChzY2FsZUZhY3RvciAqIGRhdGEub3JpZ09yaWdpblgoKSk7CiAgICAgICAgICAgICAg
ICBmbG9hdCB5ID0gaW5ZIC0gKHNjYWxlRmFjdG9yICogKChmbG9hdCkgb3JpZ1JlY3QuZ2V0SGVp
Z2h0KCkgLSBkYXRhLm9yaWdPcmlnaW5ZKCkpKTsKCiAgICAgICAgICAgICAgICBpbnQgdGV4dHVy
ZXggPSByZWN0LngoKSArIChkYXRhLm9yaWdpbigpLnggLSBkYXRhLm9yaWdPcmlnaW5YKCkpOwog
ICAgICAgICAgICAgICAgaW50IHRleHR1cmV5ID0gcmVuZGVyZXIuZ2V0SGVpZ2h0KCkgLSByZWN0
LnkoKSAtIChpbnQpIG9yaWdSZWN0LmdldEhlaWdodCgpIC0KICAgICAgICAgICAgICAgICAgICAo
ZGF0YS5vcmlnaW4oKS55IC0gZGF0YS5vcmlnT3JpZ2luWSgpKTsKICAgICAgICAgICAgICAgIGlu
dCB3aWR0aCA9IChpbnQpIG9yaWdSZWN0LmdldFdpZHRoKCk7CiAgICAgICAgICAgICAgICBpbnQg
aGVpZ2h0ID0gKGludCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCk7CgogICAgICAgICAgICAgICAgZmxv
YXQgdHgxID0geFNjYWxlICogKGZsb2F0KSB0ZXh0dXJleCAvIChmbG9hdCkgcmVuZGVyZXIuZ2V0
V2lkdGgoKTsKICAgICAgICAgICAgICAgIGZsb2F0IHR5MSA9IHlTY2FsZSAqICgxLjBmIC0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KSB0ZXh0dXJleSAvIChm
bG9hdCkgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkpKTsKICAgICAgICAgICAgICAgIGZsb2F0IHR4MiA9
IHhTY2FsZSAqIChmbG9hdCkgKHRleHR1cmV4ICsgd2lkdGgpIC8gKGZsb2F0KSByZW5kZXJlci5n
ZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgZmxvYXQgdHkyID0geVNjYWxlICogKDEuMGYgLQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpICh0ZXh0dXJleSAr
IGhlaWdodCkgLyAoZmxvYXQpIHJlbmRlcmVyLmdldEhlaWdodCgpKSk7CgogICAgICAgICAgICAg
ICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENvb3JkMmYodHgxLCB0eTEpOwogICAgICAg
ICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFZlcnRleDNmKHgsIHksIHopOwogICAg
ICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENvb3JkMmYodHgyLCB0eTEp
OwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFZlcnRleDNmKHggKyAo
d2lkdGggKiBzY2FsZUZhY3RvciksIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgeik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVhZFJlbmRl
cmVyLmdsVGV4Q29vcmQyZih0eDIsIHR5Mik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVh
ZFJlbmRlcmVyLmdsVmVydGV4M2YoeCArICh3aWR0aCAqIHNjYWxlRmFjdG9yKSwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsgKGhlaWdodCAqIHNj
YWxlRmFjdG9yKSwgeik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyLmds
VGV4Q29vcmQyZih0eDEsIHR5Mik7CiAgICAgICAgICAgICAgICBtUGlwZWxpbmVkUXVhZFJlbmRl
cmVyLmdsVmVydGV4M2YoeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB5ICsgKGhlaWdodCAqIHNjYWxlRmFjdG9yKSwgeik7CiAgICAgICAgICAgIH0g
Y2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgp
OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhZHZhbmNlOwogICAgICAgIH0KCiAg
ICAgICAgLyoqIE5vdGlmaWVzIHRoaXMgZ2x5cGggdGhhdCBpdCdzIGJlZW4gY2xlYXJlZCBvdXQg
b2YgdGhlIGNhY2hlICovCiAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAgICAgICAgICAg
IGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHBy
aXZhdGUgdm9pZCB1cGxvYWQoKSB7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZ2V0R2x5
cGhWZWN0b3IoKTsKICAgICAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ0JCb3ggPSBwcmVOb3JtYWxp
emUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKGd2LCBnZXRGb250UmVuZGVyQ29udGV4dCgpKSk7
CiAgICAgICAgICAgIFJlY3RhbmdsZTJEIGJib3ggPSBub3JtYWxpemUob3JpZ0JCb3gpOwogICAg
ICAgICAgICBQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQoKGludCkgLWJib3guZ2V0TWluWCgpLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgLWJib3guZ2V0TWluWSgp
KTsKICAgICAgICAgICAgUmVjdCByZWN0ID0gbmV3IFJlY3QoMCwgMCwgKGludCkgYmJveC5nZXRX
aWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBiYm94LmdldEhl
aWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dERhdGEobnVs
bCwgb3JpZ2luLCBvcmlnQkJveCwgdW5pY29kZUlEKSk7CiAgICAgICAgICAgIHBhY2tlci5hZGQo
cmVjdCk7CiAgICAgICAgICAgIGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nID0gcmVjdDsKICAg
ICAgICAgICAgR3JhcGhpY3MyRCBnID0gZ2V0R3JhcGhpY3MyRCgpOwogICAgICAgICAgICAvLyBP
Sywgc2hvdWxkIG5vdyBoYXZlIGFuICh4LCB5KSBmb3IgdGhpcyByZWN0YW5nbGU7IHJhc3Rlcml6
ZQogICAgICAgICAgICAvLyB0aGUgZ2x5cGgKICAgICAgICAgICAgaW50IHN0cnggPSByZWN0Lngo
KSArIG9yaWdpbi54OwogICAgICAgICAgICBpbnQgc3RyeSA9IHJlY3QueSgpICsgb3JpZ2luLnk7
CgogICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGFyZWEgd2UncmUgZ29pbmcgdG8gZHJhdyBp
bnRvCiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRlLkNsZWFyKTsKICAg
ICAgICAgICAgZy5maWxsUmVjdChyZWN0LngoKSwgcmVjdC55KCksIHJlY3QudygpLCByZWN0Lmgo
KSk7CiAgICAgICAgICAgIGcuc2V0Q29tcG9zaXRlKEFscGhhQ29tcG9zaXRlLlNyYyk7CgogICAg
ICAgICAgICAvLyBEcmF3IHRoZSBzdHJpbmcKICAgICAgICAgICAgcmVuZGVyRGVsZWdhdGUuZHJh
d0dseXBoVmVjdG9yKGcsIGd2LCBzdHJ4LCBzdHJ5KTsKCiAgICAgICAgICAgIGlmIChEUkFXX0JC
T1hFUykgewogICAgICAgICAgICAgICAgVGV4dERhdGEgZGF0YSA9IChUZXh0RGF0YSkgcmVjdC5n
ZXRVc2VyRGF0YSgpOwogICAgICAgICAgICAgICAgLy8gRHJhdyBhIGJvdW5kaW5nIGJveCBvbiB0
aGUgYmFja2luZyBzdG9yZQogICAgICAgICAgICAgICAgZy5kcmF3UmVjdChzdHJ4IC0gZGF0YS5v
cmlnT3JpZ2luWCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ5IC0gZGF0YS5vcmln
T3JpZ2luWSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBkYXRhLm9yaWdSZWN0
KCkuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgZGF0YS5vcmln
UmVjdCgpLmdldEhlaWdodCgpKTsKICAgICAgICAgICAgICAgIGcuZHJhd1JlY3Qoc3RyeCAtIGRh
dGEub3JpZ2luKCkueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyeSAtIGRhdGEub3Jp
Z2luKCkueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53KCksCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g
TWFyayB0aGlzIHJlZ2lvbiBvZiB0aGUgVGV4dHVyZVJlbmRlcmVyIGFzIGRpcnR5CiAgICAgICAg
ICAgIGdldEJhY2tpbmdTdG9yZSgpLm1hcmtEaXJ0eShyZWN0LngoKSwgcmVjdC55KCksIHJlY3Qu
dygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5oKCkpOwog
ICAgICAgICAgICAvLyBSZS1yZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCBvdXIgcHJvZHVjZXIKICAg
ICAgICAgICAgcHJvZHVjZXIucmVnaXN0ZXIodGhpcyk7CiAgICAgICAgfQoKICAgICAgICBwcml2
YXRlIEdseXBoVmVjdG9yIGdldEdseXBoVmVjdG9yKCkgewogICAgICAgICAgICBHbHlwaFZlY3Rv
ciBndiA9IHNpbmdsZVVuaWNvZGVHbHlwaFZlY3RvcjsKICAgICAgICAgICAgaWYgKGd2ICE9IG51
bGwpIHsKICAgICAgICAgICAgICAgIHNpbmdsZVVuaWNvZGVHbHlwaFZlY3RvciA9IG51bGw7IC8v
IERvbid0IG5lZWQgdGhpcyBhbnltb3JlCiAgICAgICAgICAgICAgICByZXR1cm4gZ3Y7CiAgICAg
ICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IChjaGFyKSB1bmljb2RlSUQ7
CiAgICAgICAgICAgIHJldHVybiBmb250LmNyZWF0ZUdseXBoVmVjdG9yKGdldEZvbnRSZW5kZXJD
b250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBHbHlw
aFByb2R1Y2VyIHsKICAgICAgICBmaW5hbCBpbnQgdW5kZWZpbmVkID0gLTI7CiAgICAgICAgRm9u
dFJlbmRlckNvbnRleHQgZm9udFJlbmRlckNvbnRleHQ7CiAgICAgICAgTGlzdC8qPEdseXBoPiov
IGdseXBoc091dHB1dCA9IG5ldyBBcnJheUxpc3QvKjxHbHlwaD4qLygpOwogICAgICAgIC8vIFRo
ZSBtYXBwaW5nIGZyb20gdW5pY29kZSBjaGFyYWN0ZXIgdG8gZm9udC1zcGVjaWZpYyBnbHlwaCBJ
RAogICAgICAgIGludFtdIHVuaWNvZGVzMkdseXBoczsKICAgICAgICAvLyBUaGUgbWFwcGluZyBm
cm9tIGdseXBoIElEIHRvIEdseXBoCiAgICAgICAgR2x5cGhbXSBnbHlwaENhY2hlOwogICAgICAg
IC8vIFdlIHJlLXVzZSB0aGlzIGZvciBlYWNoIGluY29taW5nIHN0cmluZwogICAgICAgIENoYXJT
ZXF1ZW5jZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQ2hhclNlcXVlbmNlSXRlcmF0b3IoKTsKCiAgICAg
ICAgR2x5cGhQcm9kdWNlcihpbnQgZm9udExlbmd0aEluR2x5cGhzKSB7CiAgICAgICAgICAgIHVu
aWNvZGVzMkdseXBocyA9IG5ldyBpbnRbNTEyXTsKICAgICAgICAgICAgZ2x5cGhDYWNoZSA9IG5l
dyBHbHlwaFtmb250TGVuZ3RoSW5HbHlwaHNdOwogICAgICAgICAgICBjbGVhckFsbENhY2hlRW50
cmllcygpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExpc3QvKjxHbHlwaD4qLyBnZXRHbHlw
aHMoQ2hhclNlcXVlbmNlIGluU3RyaW5nKSB7CiAgICAgICAgICAgIGdseXBoc091dHB1dC5jbGVh
cigpOwogICAgICAgICAgICBpdGVyLmluaXRGcm9tQ2hhclNlcXVlbmNlKGluU3RyaW5nKTsKICAg
ICAgICAgICAgR2x5cGhWZWN0b3IgZnVsbFJ1bkdseXBoVmVjdG9yID0gZm9udC5jcmVhdGVHbHlw
aFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIpOwogICAgICAg
ICAgICBib29sZWFuIGNvbXBsZXggPSAoZnVsbFJ1bkdseXBoVmVjdG9yLmdldExheW91dEZsYWdz
KCkgIT0gMCk7CiAgICAgICAgICAgIGlmIChjb21wbGV4IHx8IERJU0FCTEVfR0xZUEhfQ0FDSEUp
IHsKICAgICAgICAgICAgICAgIC8vIFB1bnQgdG8gdGhlIHJvYnVzdCB2ZXJzaW9uIG9mIHRoZSBy
ZW5kZXJlcgogICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFkZChuZXcgR2x5cGgoaW5TdHJp
bmcudG9TdHJpbmcoKSwgZmFsc2UpKTsKICAgICAgICAgICAgICAgIHJldHVybiBnbHlwaHNPdXRw
dXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBsZW5ndGhJbkdseXBocyA9IGZ1bGxS
dW5HbHlwaFZlY3Rvci5nZXROdW1HbHlwaHMoKTsKICAgICAgICAgICAgaW50IGkgPSAwOwogICAg
ICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aEluR2x5cGhzKSB7CiAgICAgICAgICAgICAgICBHbHlw
aCBnbHlwaCA9IGdldEdseXBoKGluU3RyaW5nLCBmdWxsUnVuR2x5cGhWZWN0b3IsIGkpOwogICAg
ICAgICAgICAgICAgaWYgKGdseXBoICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBnbHlw
aHNPdXRwdXQuYWRkKGdseXBoKTsKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEFzc2VtYmxlIGEgcnVuIG9mIGNo
YXJhY3RlcnMgdGhhdCBkb24ndCBmaXQgaW4KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2Fj
aGUKICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZl
cigpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoSW5HbHlwaHMgJiYKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R2x5cGgoaW5TdHJpbmcsIGZ1bGxSdW5HbHlwaFZl
Y3RvciwgaSkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGlu
U3RyaW5nLmNoYXJBdChpKyspKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg
ICAgICAgZ2x5cGhzT3V0cHV0LmFkZChuZXcgR2x5cGgoYnVmLnRvU3RyaW5nKCksCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW55IG1vcmUgZ2x5cGhz
IGFmdGVyIHRoaXMgcnVuPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGkgPCBsZW5ndGhJbkdseXBocykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICB9CiAgICAgICAgICAgIHJldHVybiBnbHlwaHNPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICBw
dWJsaWMgdm9pZCBjbGVhckNhY2hlRW50cnkoaW50IHVuaWNvZGVJRCkgewogICAgICAgICAgICBp
bnQgZ2x5cGhJRCA9IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwogICAgICAgICAgICBpZiAo
Z2x5cGhJRCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIEdseXBoIGdseXBoID0gZ2x5
cGhDYWNoZVtnbHlwaElEXTsKICAgICAgICAgICAgICAgIGlmIChnbHlwaCAhPSBudWxsKSB7CiAg
ICAgICAgICAgICAgICAgICAgZ2x5cGguY2xlYXIoKTsKICAgICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgICAgIGdseXBoQ2FjaGVbZ2x5cGhJRF0gPSBudWxsOwogICAgICAgICAgICB9CiAgICAg
ICAgICAgIHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdID0gdW5kZWZpbmVkOwogICAgICAgIH0K
CiAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBbGxDYWNoZUVudHJpZXMoKSB7CiAgICAgICAgICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgdW5pY29kZXMyR2x5cGhzLmxlbmd0aDsgaSsrKSB7CiAgICAg
ICAgICAgICAgICBjbGVhckNhY2hlRW50cnkoaSk7CiAgICAgICAgICAgIH0KICAgICAgICB9Cgog
ICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEdseXBoIGdseXBoKSB7CiAgICAgICAgICAgIHVu
aWNvZGVzMkdseXBoc1tnbHlwaC5nZXRVbmljb2RlSUQoKV0gPSBnbHlwaC5nZXRHbHlwaENvZGUo
KTsKICAgICAgICAgICAgZ2x5cGhDYWNoZVtnbHlwaC5nZXRHbHlwaENvZGUoKV0gPSBnbHlwaDsK
ICAgICAgICB9CgogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRHbHlwaFBpeGVsV2lkdGgoY2hhciB1
bmljb2RlSUQpIHsKICAgICAgICAgICAgR2x5cGggZ2x5cGggPSBnZXRHbHlwaCh1bmljb2RlSUQp
OwogICAgICAgICAgICBpZiAoZ2x5cGggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJu
IGdseXBoLmdldEFkdmFuY2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSGF2ZSB0
byBkbyB0aGlzIHRoZSBoYXJkIC8gdW5jYWNoZWQgd2F5CiAgICAgICAgICAgIHNpbmdsZVVuaWNv
ZGVbMF0gPSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZm9udC5jcmVh
dGVHbHlwaFZlY3Rvcihmb250UmVuZGVyQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVVbmljb2Rl
KTsKICAgICAgICAgICAgcmV0dXJuIGd2LmdldEdseXBoTWV0cmljcygwKS5nZXRBZHZhbmNlKCk7
CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm5zIGEgZ2x5cGggb2JqZWN0IGZvciB0aGlzIHNp
bmdsZSBnbHlwaC4gUmV0dXJucyBudWxsCiAgICAgICAgLy8gaWYgdGhlIHVuaWNvZGUgb3IgZ2x5
cGggSUQgd291bGQgYmUgb3V0IG9mIGJvdW5kcyBvZiB0aGUKICAgICAgICAvLyBnbHlwaCBjYWNo
ZS4KICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKENoYXJTZXF1ZW5jZSBpblN0cmluZywK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoVmVjdG9yIGZ1bGxSdW5HbHlwaFZl
Y3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgewogICAgICAg
ICAgICBjaGFyIHVuaWNvZGVJRCA9IGluU3RyaW5nLmNoYXJBdChpbmRleCk7CgogICAgICAgICAg
ICBpZiAodW5pY29kZUlEID49IHVuaWNvZGVzMkdseXBocy5sZW5ndGgpIHsKICAgICAgICAgICAg
ICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbnQgZ2x5cGhJRCA9
IHVuaWNvZGVzMkdseXBoc1t1bmljb2RlSURdOwogICAgICAgICAgICBpZiAoZ2x5cGhJRCAhPSB1
bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnbHlwaENhY2hlW2dseXBoSURdOwog
ICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNdXN0IGZhYnJpY2F0ZSB0aGUgZ2x5cGgKICAg
ICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IHVuaWNvZGVJRDsKICAgICAgICAgICAgR2x5cGhW
ZWN0b3IgZ3YgPSBmb250LmNyZWF0ZUdseXBoVmVjdG9yKGdldEZvbnRSZW5kZXJDb250ZXh0KCks
IHNpbmdsZVVuaWNvZGUpOwogICAgICAgICAgICByZXR1cm4gZ2V0R2x5cGgodW5pY29kZUlELCBn
diwgZnVsbFJ1bkdseXBoVmVjdG9yLmdldEdseXBoTWV0cmljcyhpbmRleCkpOwogICAgICAgIH0K
CiAgICAgICAgLy8gSXQncyB1bmNsZWFyIHdoZXRoZXIgdGhpcyB2YXJpYW50IG1pZ2h0IHByb2R1
Y2UgbGVzcwogICAgICAgIC8vIG9wdGltYWwgcmVzdWx0cyB0aGFuIGlmIHdlIGNhbiBzZWUgdGhl
IGVudGlyZSBHbHlwaFZlY3RvcgogICAgICAgIC8vIGZvciB0aGUgaW5jb21pbmcgc3RyaW5nCiAg
ICAgICAgcHJpdmF0ZSBHbHlwaCBnZXRHbHlwaChpbnQgdW5pY29kZUlEKSB7CiAgICAgICAgICAg
IGlmICh1bmljb2RlSUQgPj0gdW5pY29kZXMyR2x5cGhzLmxlbmd0aCkgewogICAgICAgICAgICAg
ICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBnbHlwaElEID0g
dW5pY29kZXMyR2x5cGhzW3VuaWNvZGVJRF07CiAgICAgICAgICAgIGlmIChnbHlwaElEICE9IHVu
ZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGdseXBoQ2FjaGVbZ2x5cGhJRF07CiAg
ICAgICAgICAgIH0KICAgICAgICAgICAgc2luZ2xlVW5pY29kZVswXSA9IChjaGFyKSB1bmljb2Rl
SUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZm9udC5jcmVhdGVHbHlwaFZlY3Rvcihn
ZXRGb250UmVuZGVyQ29udGV4dCgpLCBzaW5nbGVVbmljb2RlKTsKICAgICAgICAgICAgcmV0dXJu
IGdldEdseXBoKHVuaWNvZGVJRCwgZ3YsIGd2LmdldEdseXBoTWV0cmljcygwKSk7CiAgICAgICAg
fQoKICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKGludCB1bmljb2RlSUQsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBHbHlwaFZlY3RvciBzaW5nbGVVbmljb2RlR2x5cGhWZWN0
b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaE1ldHJpY3MgbWV0cmljcykg
ewogICAgICAgICAgICBpbnQgZ2x5cGhDb2RlID0gc2luZ2xlVW5pY29kZUdseXBoVmVjdG9yLmdl
dEdseXBoQ29kZSgwKTsKICAgICAgICAgICAgLy8gSGF2ZSBzZWVuIGh1Z2UgZ2x5cGggY29kZXMg
KDY1NTM2KSBjb21pbmcgb3V0IG9mIHNvbWUgZm9udHMgaW4gc29tZSBVbmljb2RlIHNpdHVhdGlv
bnMKICAgICAgICAgICAgaWYgKGdseXBoQ29kZSA+PSBnbHlwaENhY2hlLmxlbmd0aCkgewogICAg
ICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgR2x5cGgg
Z2x5cGggPSBuZXcgR2x5cGgodW5pY29kZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBnbHlwaENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1l
dHJpY3MuZ2V0QWR2YW5jZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
aW5nbGVVbmljb2RlR2x5cGhWZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHRoaXMpOwogICAgICAgICAgICByZWdpc3RlcihnbHlwaCk7CiAgICAgICAgICAgIHJldHVy
biBnbHlwaDsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgUGlwZWxpbmVkX1F1YWRSZW5kZXJl
ciB7CiAgICAgICAgaW50IG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgPSAwOwog
ICAgICAgIEZsb2F0QnVmZmVyIG1UZXhDb29yZHM7CiAgICAgICAgRmxvYXRCdWZmZXIgbVZlcnRD
b29yZHM7CiAgICAgICAgYm9vbGVhbiB1c2luZ1ZCT3M7CiAgICAgICAgYm9vbGVhbiBmb3JjZVVu
YmluZEJ1ZmZlcjsKICAgICAgICBpbnQgbVZCT19Gb3JfUmVzdWFibGVUaWxlVmVydGljZXM7CiAg
ICAgICAgaW50IG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVRleENvb3JkczsKCiAgICAgICAgUGlwZWxp
bmVkX1F1YWRSZW5kZXJlcigpIHsKICAgICAgICAgICAgR0wgZ2wgPSBHTFUuZ2V0Q3VycmVudEdM
KCk7CiAgICAgICAgICAgIG1WZXJ0Q29vcmRzID0gQnVmZmVyVXRpbC5uZXdGbG9hdEJ1ZmZlcihr
VG90YWxCdWZmZXJTaXplQ29vcmRzVmVydHMpOwogICAgICAgICAgICBtVGV4Q29vcmRzID0gQnVm
ZmVyVXRpbC5uZXdGbG9hdEJ1ZmZlcihrVG90YWxCdWZmZXJTaXplQ29vcmRzVGV4KTsKCiAgICAg
ICAgICAgIHVzaW5nVkJPcyA9IGlzMTVBdmFpbGFibGUoZ2wpOwogICAgICAgICAgICAKICAgICAg
ICAgICAgLyoKICAgICAgICAgICAgICogSnVsaWVuIEdvdWVzc2U6IHdlIGhhdmUgdG8gdW5iaW5k
IHRoZSBsYXRlc3QgYm91bmQgYnVmZmVyIHdoZW4gdXNpbmcKICAgICAgICAgICAgICogdmVydGV4
IGFycmF5cyBiZWNhdXNlIGl0IGF2b2lkcyBhIGNvbnRyYWRpY3Rpb24gYmV0d2VlbiB0aGUgcG9p
bnRlciB1c2VkCiAgICAgICAgICAgICAqIGJ5IGdsVmVydGV4UG9pbnRlciBhbmQgdGhlIGxhdGVz
dCBidWZmZXIgdGhhdCBtYXkgcG9pbnQgdG8gYSBWQk8gb2YgdGhlIAogICAgICAgICAgICAgKiBw
cm9ncmFtIHVzaW5nIGEgVGV4dFJlbmRlcmVyLgogICAgICAgICAgICAgKiBUaGUgdGVzdCB0YWtl
cyBpbnRvIGFjY291bnQgdGhlIHBvc3NpYmlsaXR5IG9mIHVzaW5nIEFSQiBWQk8gaW4gT3BlbkdM
IDEuMyAKICAgICAgICAgICAgICogYW5kIHRoZSBwb3NzaWJpbGl0eSBvZiB1c2luZyBFWFQgVkJP
IGluIE9wZW5HTCAxLjQKICAgICAgICAgICAgICogRGlydHkgdHJ5L2NhdGNoIGFyZSBuZWVkZWQg
dG8gcHJldmVudCBjcmFzaCBvbiBzb21lIG9uYm9hcmQgZ3JhcGhpY3MKICAgICAgICAgICAgICog
ICovCiAgICAgICAgICAgIGZvcmNlVW5iaW5kQnVmZmVyID0gKGdsLmlzRXh0ZW5zaW9uQXZhaWxh
YmxlKCJHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QiKSAmJiAKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZ2wuaXNGdW5jdGlvbkF2YWlsYWJsZSgiZ2xCaW5kQnVmZmVyQVJCIikp
IHx8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnbC5pc0V4dGVuc2lvbkF2YWls
YWJsZSgiR0xfRVhUX3ZlcnRleF9idWZmZXJfb2JqZWN0IikgJiYgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGdsLmlzRnVuY3Rpb25BdmFpbGFibGUoImdsQmluZEJ1ZmZlciIpKTsK
CiAgICAgICAgICAgIGlmICh1c2luZ1ZCT3MpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAg
ICAgICAgICAgICAgICAgaW50W10gdmJvcyA9IG5ldyBpbnRbMl07CiAgICAgICAgICAgICAgICAg
ICAgZ2wuZ2xHZW5CdWZmZXJzKDIsIEludEJ1ZmZlci53cmFwKHZib3MpKTsKCiAgICAgICAgICAg
ICAgICAgICAgbVZCT19Gb3JfUmVzdWFibGVUaWxlVmVydGljZXMgPSB2Ym9zWzBdOwogICAgICAg
ICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVRleENvb3JkcyA9IHZib3NbMV07Cgog
ICAgICAgICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJBWV9CVUZGRVIsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZl
cnRpY2VzKTsKICAgICAgICAgICAgICAgICAgICBnbC5nbEJ1ZmZlckRhdGEoR0wuR0xfQVJSQVlf
QlVGRkVSLCBrVG90YWxCdWZmZXJTaXplQnl0ZXNWZXJ0cywKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbnVsbCwgR0wuR0xfU1RSRUFNX0RSQVcpOyAvLyBzdHJlYW0gZHJhdyBi
ZWNhdXNlIHRoaXMgaXMgYSBzaW5nbGUgcXVhZCB1c2UgcGlwZWxpbmUKCiAgICAgICAgICAgICAg
ICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbVZCT19Gb3JfUmVzdWFibGVUaWxlVGV4Q29vcmRzKTsKICAg
ICAgICAgICAgICAgICAgICBnbC5nbEJ1ZmZlckRhdGEoR0wuR0xfQVJSQVlfQlVGRkVSLCBrVG90
YWxCdWZmZXJTaXplQnl0ZXNUZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG51bGwsIEdMLkdMX1NUUkVBTV9EUkFXKTsgLy8gc3RyZWFtIGRyYXcgYmVjYXVzZSB0aGlzIGlz
IGEgc2luZ2xlIHF1YWQgdXNlIHBpcGVsaW5lCiAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNl
cHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIGlzRXh0ZW5zaW9uQXZhaWxhYmxlX0dMX1ZF
UlNJT05fMV81ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdXNpbmdWQk9zID0gZmFsc2U7
CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1Ymxp
YyB2b2lkIGdsVGV4Q29vcmQyZihmbG9hdCB2LCBmbG9hdCB2MSkgewogICAgICAgICAgICBtVGV4
Q29vcmRzLnB1dCh2KTsKICAgICAgICAgICAgbVRleENvb3Jkcy5wdXQodjEpOwogICAgICAgIH0K
CiAgICAgICAgcHVibGljIHZvaWQgZ2xWZXJ0ZXgzZihmbG9hdCBpblgsIGZsb2F0IGluWSwgZmxv
YXQgaW5aKSB7CiAgICAgICAgICAgIG1WZXJ0Q29vcmRzLnB1dChpblgpOwogICAgICAgICAgICBt
VmVydENvb3Jkcy5wdXQoaW5ZKTsKICAgICAgICAgICAgbVZlcnRDb29yZHMucHV0KGluWik7Cgog
ICAgICAgICAgICBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lKys7CgogICAgICAg
ICAgICBpZiAobU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSA+PSBrVG90YWxCdWZm
ZXJTaXplVmVydHMpIHsKICAgICAgICAgICAgICAgIHRoaXMuZHJhdygpOwogICAgICAgICAgICB9
CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHZvaWQgZHJhdygpIHsKICAgICAgICAgICAgaWYg
KHVzZVZlcnRleEFycmF5cykgewogICAgICAgICAgICAgICAgZHJhd1ZlcnRleEFycmF5cygpOwog
ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZHJhd0lNTUVESUFURSgpOwogICAg
ICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHZvaWQgZHJhd1ZlcnRleEFycmF5
cygpIHsKICAgICAgICAgICAgaWYgKG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUg
PiAwKSB7CiAgICAgICAgICAgICAgICBHTCBnbCA9IEdMVS5nZXRDdXJyZW50R0woKTsKCiAgICAg
ICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXIgPSBnZXRCYWNraW5nU3RvcmUoKTsK
ICAgICAgICAgICAgICAgIFRleHR1cmUgdGV4dHVyZSA9IHJlbmRlcmVyLmdldFRleHR1cmUoKTsg
Ly8gdHJpZ2dlcnMgdGV4dHVyZSB1cGxvYWRzLiAgTWF5YmUgdGhpcyBzaG91bGQgYmUgbW9yZSBv
YnZpb3VzPwoKICAgICAgICAgICAgICAgIG1WZXJ0Q29vcmRzLnJld2luZCgpOwogICAgICAgICAg
ICAgICAgbVRleENvb3Jkcy5yZXdpbmQoKTsKCiAgICAgICAgICAgICAgICBnbC5nbEVuYWJsZUNs
aWVudFN0YXRlKEdMLkdMX1ZFUlRFWF9BUlJBWSk7CgogICAgICAgICAgICAgICAgaWYgKHVzaW5n
VkJPcykgewogICAgICAgICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJBWV9C
VUZGRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3Vh
YmxlVGlsZVZlcnRpY2VzKTsKICAgICAgICAgICAgICAgICAgICBnbC5nbEJ1ZmZlclN1YkRhdGEo
R0wuR0xfQVJSQVlfQlVGRkVSLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lICoga1NpemVJbkJ5dGVzX09u
ZVZlcnRpY2VzX1ZlcnRleERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1WZXJ0Q29vcmRzKTsgLy8gdXBsb2FkIG9ubHkgdGhlIG5ldyBzdHVmZgogICAgICAgICAg
ICAgICAgICAgIGdsLmdsVmVydGV4UG9pbnRlcigzLCBHTC5HTF9GTE9BVCwgMCwgMCk7CiAgICAg
ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZVVuYmluZEJ1
ZmZlcikgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMLkdMX0FSUkFZX0JVRkZFUiwgMCk7CiAgICAgICAg
ICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBmb3JjZVVuYmluZEJ1ZmZlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAg
ICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdsLmdsVmVy
dGV4UG9pbnRlcigzLCBHTC5HTF9GTE9BVCwgMCwgbVZlcnRDb29yZHMpOwogICAgICAgICAgICAg
ICAgfQoKICAgICAgICAgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoR0wuR0xfVEVYVFVS
RV9DT09SRF9BUlJBWSk7CgogICAgICAgICAgICAgICAgaWYgKHVzaW5nVkJPcykgewogICAgICAg
ICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihHTC5HTF9BUlJBWV9CVUZGRVIsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVRleENvb3Jk
cyk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xCdWZmZXJTdWJEYXRhKEdMLkdMX0FSUkFZX0JV
RkZFUiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHN0YW5k
aW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSAqIGtTaXplSW5CeXRlc19PbmVWZXJ0aWNlc19UZXhE
YXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4Q29vcmRzKTsg
Ly8gdXBsb2FkIG9ubHkgdGhlIG5ldyBzdHVmZgogICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4
Q29vcmRQb2ludGVyKDIsIEdMLkdMX0ZMT0FULCAwLCAwKTsKICAgICAgICAgICAgICAgIH0gZWxz
ZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlVW5iaW5kQnVmZmVyKSB7CiAgICAgICAg
ICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbC5nbEJp
bmRCdWZmZXIoR0wuR0xfQVJSQVlfQlVGRkVSLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAg
fSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNl
VW5iaW5kQnVmZmVyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZFBvaW50ZXIoMiwg
R0wuR0xfRkxPQVQsIDAsIG1UZXhDb29yZHMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAg
ICAgICAgIGdsLmdsRHJhd0FycmF5cyhHTC5HTF9RVUFEUywgMCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lKTsKCiAgICAg
ICAgICAgICAgICBtVmVydENvb3Jkcy5yZXdpbmQoKTsKICAgICAgICAgICAgICAgIG1UZXhDb29y
ZHMucmV3aW5kKCk7CiAgICAgICAgICAgICAgICBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1Bp
cGVsaW5lID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHJpdmF0ZSB2b2lk
IGRyYXdJTU1FRElBVEUoKSB7CiAgICAgICAgICAgIGlmIChtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0
aWNlc1BpcGVsaW5lID4gMCkgewogICAgICAgICAgICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRl
cmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CiAgICAgICAgICAgICAgICBUZXh0dXJlIHRleHR1cmUg
PSByZW5kZXJlci5nZXRUZXh0dXJlKCk7IC8vIHRyaWdnZXJzIHRleHR1cmUgdXBsb2Fkcy4gIE1h
eWJlIHRoaXMgc2hvdWxkIGJlIG1vcmUgb2J2aW91cz8KCiAgICAgICAgICAgICAgICBHTCBnbCA9
IEdMVS5nZXRDdXJyZW50R0woKTsKICAgICAgICAgICAgICAgIGdsLmdsQmVnaW4oR0wuR0xfUVVB
RFMpOwoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW50IG51bWJl
ck9mUXVhZHMgPSBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lIC8gNDsKICAgICAg
ICAgICAgICAgICAgICBtVmVydENvb3Jkcy5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICBt
VGV4Q29vcmRzLnJld2luZCgpOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsg
aSA8IG51bWJlck9mUXVhZHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBnbC5nbFRl
eENvb3JkMmYobVRleENvb3Jkcy5nZXQoKSwgbVRleENvb3Jkcy5nZXQoKSk7CiAgICAgICAgICAg
ICAgICAgICAgICAgIGdsLmdsVmVydGV4M2YobVZlcnRDb29yZHMuZ2V0KCksIG1WZXJ0Q29vcmRz
LmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZXJ0Q29vcmRz
LmdldCgpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVGV4Q29vcmQyZihtVGV4Q29v
cmRzLmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZ2wu
Z2xWZXJ0ZXgzZihtVmVydENvb3Jkcy5nZXQoKSwgbVZlcnRDb29yZHMuZ2V0KCksCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlcnRDb29yZHMuZ2V0KCkpOwoKICAgICAg
ICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZDJmKG1UZXhDb29yZHMuZ2V0KCksIG1UZXhD
b29yZHMuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBnbC5nbFZlcnRleDNmKG1WZXJ0
Q29vcmRzLmdldCgpLCBtVmVydENvb3Jkcy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQoKSk7CgogICAgICAgICAgICAgICAgICAgICAg
ICBnbC5nbFRleENvb3JkMmYobVRleENvb3Jkcy5nZXQoKSwgbVRleENvb3Jkcy5nZXQoKSk7CiAg
ICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4M2YobVZlcnRDb29yZHMuZ2V0KCksIG1W
ZXJ0Q29vcmRzLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1W
ZXJ0Q29vcmRzLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9
IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1Ry
YWNlKCk7CiAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgIGds
LmdsRW5kKCk7CiAgICAgICAgICAgICAgICAgICAgbVZlcnRDb29yZHMucmV3aW5kKCk7CiAgICAg
ICAgICAgICAgICAgICAgbVRleENvb3Jkcy5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICBt
T3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lID0gMDsKICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBEZWJ1Z0xpc3RlbmVyIGlt
cGxlbWVudHMgR0xFdmVudExpc3RlbmVyIHsKICAgICAgICBwcml2YXRlIEdMVSBnbHUgPSBuZXcg
R0xVKCk7CiAgICAgICAgcHJpdmF0ZSBGcmFtZSBmcmFtZTsKCiAgICAgICAgRGVidWdMaXN0ZW5l
cihGcmFtZSBmcmFtZSkgewogICAgICAgICAgICB0aGlzLmZyYW1lID0gZnJhbWU7CiAgICAgICAg
fQoKICAgICAgICBwdWJsaWMgdm9pZCBkaXNwbGF5KEdMQXV0b0RyYXdhYmxlIGRyYXdhYmxlKSB7
CiAgICAgICAgICAgIEdMIGdsID0gZHJhd2FibGUuZ2V0R0woKTsKICAgICAgICAgICAgZ2wuZ2xD
bGVhcihHTC5HTF9ERVBUSF9CVUZGRVJfQklUIHwgR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCk7Cgog
ICAgICAgICAgICBpZiAocGFja2VyID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybjsK
ICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmQgPSBnZXRCYWNr
aW5nU3RvcmUoKTsKICAgICAgICAgICAgZmluYWwgaW50IHcgPSByZW5kLmdldFdpZHRoKCk7CiAg
ICAgICAgICAgIGZpbmFsIGludCBoID0gcmVuZC5nZXRIZWlnaHQoKTsKICAgICAgICAgICAgcmVu
ZC5iZWdpbk9ydGhvUmVuZGVyaW5nKHcsIGgpOwogICAgICAgICAgICByZW5kLmRyYXdPcnRob1Jl
Y3QoMCwgMCk7CiAgICAgICAgICAgIHJlbmQuZW5kT3J0aG9SZW5kZXJpbmcoKTsKCiAgICAgICAg
ICAgIGlmICgoZnJhbWUuZ2V0V2lkdGgoKSAhPSB3KSB8fCAoZnJhbWUuZ2V0SGVpZ2h0KCkgIT0g
aCkpIHsKICAgICAgICAgICAgICAgIEV2ZW50UXVldWUuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxl
KCkgewogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBmcmFtZS5zZXRTaXplKHcsIGgpOwogICAgICAgICAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9
CgogICAgICAgIC8vIFVudXNlZCBtZXRob2RzCiAgICAgICAgcHVibGljIHZvaWQgaW5pdChHTEF1
dG9EcmF3YWJsZSBkcmF3YWJsZSkgewogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgcmVz
aGFwZShHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CiAgICAgICAgfQoKICAgICAg
ICBwdWJsaWMgdm9pZCBkaXNwbGF5Q2hhbmdlZChHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1vZGVDaGFuZ2VkLCBib29s
ZWFuIGRldmljZUNoYW5nZWQpIHsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRz
IHdoZXRoZXIgdmVydGV4IGFycmF5cyBhcmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5IGZvcgogICAg
ICogcmVuZGVyaW5nLCBvciB3aGV0aGVyIHRleHQgaXMgcmVuZGVyZWQgdXNpbmcgdGhlIE9wZW5H
TAogICAgICogaW1tZWRpYXRlIG1vZGUgY29tbWFuZHMuIFRoaXMgaXMgcHJvdmlkZWQgYXMgYSBj
b25jZXNzaW9uIGZvcgogICAgICogY2VydGFpbiBncmFwaGljcyBjYXJkcyB3aGljaCBoYXZlIHBv
b3IgdmVydGV4IGFycmF5CiAgICAgKiBwZXJmb3JtYW5jZS4gRGVmYXVsdHMgdG8gdHJ1ZS4KICAg
ICAqLwogICAgcHVibGljIHZvaWQgc2V0VXNlVmVydGV4QXJyYXlzKGJvb2xlYW4gdXNlVmVydGV4
QXJyYXlzKSB7CiAgICAgICAgdGhpcy51c2VWZXJ0ZXhBcnJheXMgPSB1c2VWZXJ0ZXhBcnJheXM7
CiAgICB9CgogICAgLyoqCiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB2ZXJ0ZXggYXJyYXlzIGFy
ZSBiZWluZyB1c2VkIGludGVybmFsbHkgZm9yCiAgICAgKiByZW5kZXJpbmcsIG9yIHdoZXRoZXIg
dGV4dCBpcyByZW5kZXJlZCB1c2luZyB0aGUgT3BlbkdMCiAgICAgKiBpbW1lZGlhdGUgbW9kZSBj
b21tYW5kcy4gRGVmYXVsdHMgdG8gdHJ1ZS4KICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gZ2V0
VXNlVmVydGV4QXJyYXlzKCkgewogICAgICAgIHJldHVybiB1c2VWZXJ0ZXhBcnJheXM7CiAgICB9
CgogICAgLyoqCiAgICAgKiBTZXRzIHdoZXRoZXIgc21vb3RoaW5nIChpLmUuLCBHTF9MSU5FQVIg
ZmlsdGVyaW5nKSBpcyBlbmFibGVkCiAgICAgKiBpbiB0aGUgYmFja2luZyBUZXh0dXJlUmVuZGVy
ZXIgb2YgdGhpcyBUZXh0UmVuZGVyZXIuIEEgZmV3CiAgICAgKiBncmFwaGljcyBjYXJkcyBkbyBu
b3QgYmVoYXZlIHdlbGwgd2hlbiB0aGlzIGlzIGVuYWJsZWQsCiAgICAgKiByZXN1bHRpbmcgaW4g
ZnV6enkgdGV4dC4gRGVmYXVsdHMgdG8gdHJ1ZS4KICAgICAqLwogICAgcHVibGljIHZvaWQgc2V0
U21vb3RoaW5nKGJvb2xlYW4gc21vb3RoaW5nKSB7CiAgICAgICAgdGhpcy5zbW9vdGhpbmcgPSBz
bW9vdGhpbmc7CiAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuc2V0U21vb3RoaW5nKHNtb290aGlu
Zyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBzbW9vdGhpbmcgaXMg
ZW5hYmxlZCBpbiB0aGUgYmFja2luZwogICAgICogVGV4dHVyZVJlbmRlcmVyIG9mIHRoaXMgVGV4
dFJlbmRlcmVyLiBBIGZldyBncmFwaGljcyBjYXJkcyBkbwogICAgICogbm90IGJlaGF2ZSB3ZWxs
IHdoZW4gdGhpcyBpcyBlbmFibGVkLCByZXN1bHRpbmcgaW4gZnV6enkgdGV4dC4KICAgICAqIERl
ZmF1bHRzIHRvIHRydWUuCiAgICAgKi8KICAgIHB1YmxpYyBib29sZWFuIGdldFNtb290aGluZygp
IHsKICAgICAgICByZXR1cm4gc21vb3RoaW5nOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBp
czE1QXZhaWxhYmxlKEdMIGdsKSB7CiAgICAgICAgaWYgKCFjaGVja0Zvcl9pc0V4dGVuc2lvbkF2
YWlsYWJsZV9HTF9WRVJTSU9OXzFfNSkgewogICAgICAgICAgICBpc0V4dGVuc2lvbkF2YWlsYWJs
ZV9HTF9WRVJTSU9OXzFfNSA9IGdsLmlzRXh0ZW5zaW9uQXZhaWxhYmxlKCJHTF9WRVJTSU9OXzFf
NSIpOwogICAgICAgICAgICBjaGVja0Zvcl9pc0V4dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJTSU9O
XzFfNSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpc0V4dGVuc2lvbkF2YWlsYWJs
ZV9HTF9WRVJTSU9OXzFfNTsKICAgIH0KfQoK
</data>

          </attachment>
      

    </bug>

</bugzilla>