<?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>1101</bug_id>
          
          <creation_ts>2014-11-03 17:55:24 +0100</creation_ts>
          <short_desc>Memory leak on TextRenderer</short_desc>
          <delta_ts>2019-08-20 18:52:24 +0200</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>3</classification_id>
          <classification>JogAmp</classification>
          <product>Jogl</product>
          <component>opengl</component>
          <version>2.4.0</version>
          <rep_platform>All</rep_platform>
          <op_sys>all</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>---</priority>
          <bug_severity>major</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Tof">cgarrigues</reporter>
          <assigned_to name="Sven Gothel">sgothel</assigned_to>
          <cc>gouessej</cc>
          
          <cf_type>DEFECT</cf_type>
          <cf_scm_refs>1f0d7d4b416521ef56fdc81b28d128c7f3279188</cf_scm_refs>
          <cf_workaround>---</cf_workaround>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>4437</commentid>
    <comment_count>0</comment_count>
    <who name="Tof">cgarrigues</who>
    <bug_when>2014-11-03 17:55:24 +0100</bug_when>
    <thetext>When using VBO, they are non released on dispose()
 in class Pipelined_QuadRenderer.
Lead to system memory leak when creating and deleting com.jogamp.opengl.util.awt.TexRenderer objects.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>4439</commentid>
    <comment_count>1</comment_count>
    <who name="Tof">cgarrigues</who>
    <bug_when>2014-11-04 13:22:18 +0100</bug_when>
    <thetext>class Pipelined_QuadRenderer in TextRenderer.java,line 1786 :

                    gl.glGenBuffers(2, IntBuffer.wrap(vbos));

                    mVBO_For_ResuableTileVertices = vbos[0];
                    mVBO_For_ResuableTileTexCoords = vbos[1];</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>4440</commentid>
    <comment_count>2</comment_count>
      <attachid>665</attachid>
    <who name="Tof">cgarrigues</who>
    <bug_when>2014-11-04 13:25:35 +0100</bug_when>
    <thetext>Created attachment 665
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>4691</commentid>
    <comment_count>3</comment_count>
    <who name="Julien Gouesse">gouessej</who>
    <bug_when>2015-03-31 16:41:01 +0200</bug_when>
    <thetext>Hi

You added a dispose() method into the main class:
public void dispose() {
             GL2 gl = GLContext.getCurrentGL().getGL2();
             int[] vbos = new int[2];
             vbos[0] = mVBO_For_ResuableTileVertices;
             vbos[1] = mVBO_For_ResuableTileTexCoords;
             gl.glDeleteBuffers(2, IntBuffer.wrap(vbos));
		}


and you improved the dispose() method of the debug listener:
@Override
        public void dispose(GLAutoDrawable drawable) {
        	mPipelinedQuadRenderer.dispose();
            glu.destroy();
            glu=null;
            frame=null;
        }

Please can you make a pull request?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>4694</commentid>
    <comment_count>4</comment_count>
    <who name="Tof">cgarrigues</who>
    <bug_when>2015-04-01 09:46:20 +0200</bug_when>
    <thetext>Sorry, but I don&apos;t know how to do it ... :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>4695</commentid>
    <comment_count>5</comment_count>
    <who name="Julien Gouesse">gouessej</who>
    <bug_when>2015-04-01 13:05:03 +0200</bug_when>
    <thetext>(In reply to comment #4)
&gt; Sorry, but I don&apos;t know how to do it ... :(

http://jogamp.org/wiki/index.php/How_to_Contribute</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>6272</commentid>
    <comment_count>6</comment_count>
    <who name="Julien Gouesse">gouessej</who>
    <bug_when>2019-08-20 12:39:01 +0200</bug_when>
    <thetext>Someone else has the same problem:
http://forum.jogamp.org/TextRenderer-memory-leak-td4039967.html

Maybe we should consider using the proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>6273</commentid>
    <comment_count>7</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2019-08-20 18:27:28 +0200</bug_when>
    <thetext>Move version to 2.4.0.

Please test the proposed patch.

We need a unit test?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>6274</commentid>
    <comment_count>8</comment_count>
      <attachid>819</attachid>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2019-08-20 18:48:24 +0200</bug_when>
    <thetext>Created attachment 819
Cleaned up Patch from original proposal</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>6275</commentid>
    <comment_count>9</comment_count>
    <who name="Sven Gothel">sgothel</who>
    <bug_when>2019-08-20 18:52:24 +0200</bug_when>
    <thetext>(In reply to Tof from comment #2)
&gt; Created attachment 665 [details]
&gt; Proposed patch

Excellent work Tof, thank you!

I reviewed you code and indeed, the VBOs were not deleted.
Your patch fixes this leak, IMHO.

I added your patch and will push it soon
commit 1f0d7d4b416521ef56fdc81b28d128c7f3279188</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>665</attachid>
            <date>2014-11-04 13:25:35 +0100</date>
            <delta_ts>2019-08-20 18:48:24 +0200</delta_ts>
            <desc>Proposed patch</desc>
            <filename>TextRenderer.java</filename>
            <type>text/plain</type>
            <size>81154</size>
            <attacher name="Tof">cgarrigues</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChjKSAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KICogQ29weXJpZ2h0IChjKSAyMDEwIEpvZ0FtcCBDb21tdW5pdHkuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCiAqIG1ldDoK
ICoKICogLSBSZWRpc3RyaWJ1dGlvbiBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CiAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAtIFJlZGlzdHJpYnV0aW9uIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAq
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KICoKICogTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1z
LCBJbmMuIG9yIHRoZSBuYW1lcyBvZgogKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogKiB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUaGlzIHNvZnR3
YXJlIGlzIHByb3ZpZGVkICJBUyBJUywiIHdpdGhvdXQgYSB3YXJyYW50eSBvZiBhbnkga2luZC4g
QUxMCiAqIEVYUFJFU1MgT1IgSU1QTElFRCBDT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5E
IFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFO
VEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKICogUEFSVElDVUxBUiBQVVJQT1NFIE9SIE5PTi1JTkZS
SU5HRU1FTlQsIEFSRSBIRVJFQlkgRVhDTFVERUQuIFNVTgogKiBNSUNST1NZU1RFTVMsIElOQy4g
KCJTVU4iKSBBTkQgSVRTIExJQ0VOU09SUyBTSEFMTCBOT1QgQkUgTElBQkxFIEZPUgogKiBBTlkg
REFNQUdFUyBTVUZGRVJFRCBCWSBMSUNFTlNFRSBBUyBBIFJFU1VMVCBPRiBVU0lORywgTU9ESUZZ
SU5HIE9SCiAqIERJU1RSSUJVVElORyBUSElTIFNPRlRXQVJFIE9SIElUUyBERVJJVkFUSVZFUy4g
SU4gTk8gRVZFTlQgV0lMTCBTVU4gT1IKICogSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIEFO
WSBMT1NUIFJFVkVOVUUsIFBST0ZJVCBPUiBEQVRBLCBPUiBGT1IKICogRElSRUNULCBJTkRJUkVD
VCwgU1BFQ0lBTCwgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCBPUiBQVU5JVElWRQogKiBEQU1B
R0VTLCBIT1dFVkVSIENBVVNFRCBBTkQgUkVHQVJETEVTUyBPRiBUSEUgVEhFT1JZIE9GIExJQUJJ
TElUWSwKICogQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYKICogU1VOIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICoKICogWW91IGFja25vd2xlZGdlIHRoYXQgdGhpcyBz
b2Z0d2FyZSBpcyBub3QgZGVzaWduZWQgb3IgaW50ZW5kZWQgZm9yIHVzZQogKiBpbiB0aGUgZGVz
aWduLCBjb25zdHJ1Y3Rpb24sIG9wZXJhdGlvbiBvciBtYWludGVuYW5jZSBvZiBhbnkgbnVjbGVh
cgogKiBmYWNpbGl0eS4KICoKICogU3VuIGdyYXRlZnVsbHkgYWNrbm93bGVkZ2VzIHRoYXQgdGhp
cyBzb2Z0d2FyZSB3YXMgb3JpZ2luYWxseSBhdXRob3JlZAogKiBhbmQgZGV2ZWxvcGVkIGJ5IEtl
bm5ldGggQnJhZGxleSBSdXNzZWxsIGFuZCBDaHJpc3RvcGhlciBKb2huIEtsaW5lLgogKi8KcGFj
a2FnZSBjb20uam9nYW1wLm9wZW5nbC51dGlsLmF3dDsKCmltcG9ydCBjb20uam9nYW1wLmNvbW1v
bi5uaW8uQnVmZmVyczsKCmltcG9ydCBjb20uam9nYW1wLm9wZW5nbC5HTEV4dGVuc2lvbnM7Cmlt
cG9ydCBjb20uam9nYW1wLm9wZW5nbC51dGlsLio7CmltcG9ydCBjb20uam9nYW1wLm9wZW5nbC51
dGlsLnBhY2tyZWN0Lio7CmltcG9ydCBjb20uam9nYW1wLm9wZW5nbC51dGlsLnRleHR1cmUuKjsK
CmltcG9ydCBqYXZhLmF3dC5BbHBoYUNvbXBvc2l0ZTsKaW1wb3J0IGphdmEuYXd0LkNvbG9yOwoK
Ly8gRm9yIGRlYnVnZ2luZyBwdXJwb3NlcwppbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKaW1w
b3J0IGphdmEuYXd0LkZvbnQ7CmltcG9ydCBqYXZhLmF3dC5GcmFtZTsKaW1wb3J0IGphdmEuYXd0
LkdyYXBoaWNzMkQ7CmltcG9ydCBqYXZhLmF3dC5JbWFnZTsKaW1wb3J0IGphdmEuYXd0LlBvaW50
OwppbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7CmltcG9ydCBqYXZhLmF3dC5ldmVudC4q
OwppbXBvcnQgamF2YS5hd3QuZm9udC4qOwppbXBvcnQgamF2YS5hd3QuZ2VvbS4qOwoKaW1wb3J0
IGphdmEubmlvLio7CgppbXBvcnQgamF2YS50ZXh0Lio7CgppbXBvcnQgamF2YS51dGlsLio7Cgpp
bXBvcnQgamF2YXgubWVkaWEub3BlbmdsLio7CmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuZ2x1
Lio7CmltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuYXd0Lio7CgppbXBvcnQgam9nYW1wLm9wZW5n
bC5EZWJ1ZzsKCgovKiogUmVuZGVycyBiaXRtYXBwZWQgSmF2YSAyRCB0ZXh0IGludG8gYW4gT3Bl
bkdMIHdpbmRvdyB3aXRoIGhpZ2gKICAgIHBlcmZvcm1hbmNlLCBmdWxsIFVuaWNvZGUgc3VwcG9y
dCwgYW5kIGEgc2ltcGxlIEFQSS4gUGVyZm9ybXMKICAgIGFwcHJvcHJpYXRlIGNhY2hpbmcgb2Yg
dGV4dCByZW5kZXJpbmcgcmVzdWx0cyBpbiBhbiBPcGVuR0wgdGV4dHVyZQogICAgaW50ZXJuYWxs
eSB0byBhdm9pZCByZXBlYXRlZCBmb250IHJhc3Rlcml6YXRpb24uIFRoZSBjYWNoaW5nIGlzCiAg
ICBjb21wbGV0ZWx5IGF1dG9tYXRpYywgZG9lcyBub3QgcmVxdWlyZSBhbnkgdXNlciBpbnRlcnZl
bnRpb24sIGFuZAogICAgaGFzIG5vIHZpc2libGUgY29udHJvbHMgaW4gdGhlIHB1YmxpYyBBUEku
IDxQPgoKICAgIFVzaW5nIHRoZSB7QGxpbmsgVGV4dFJlbmRlcmVyIFRleHRSZW5kZXJlcn0gaXMg
c2ltcGxlLiBBZGQgYQogICAgIjxjb2RlPlRleHRSZW5kZXJlciByZW5kZXJlcjs8L2NvZGU+IiBm
aWVsZCB0byB5b3VyIHtAbGluawogICAgamF2YXgubWVkaWEub3BlbmdsLkdMRXZlbnRMaXN0ZW5l
ciBHTEV2ZW50TGlzdGVuZXJ9LiBJbiB5b3VyIHtAbGluawogICAgamF2YXgubWVkaWEub3Blbmds
LkdMRXZlbnRMaXN0ZW5lciNpbml0IGluaXR9IG1ldGhvZCwgYWRkOgoKICAgIDxQUkU+CiAgICBy
ZW5kZXJlciA9IG5ldyBUZXh0UmVuZGVyZXIobmV3IEZvbnQoIlNhbnNTZXJpZiIsIEZvbnQuQk9M
RCwgMzYpKTsKICAgIDwvUFJFPgoKICAgIDxQPiBJbiB0aGUge0BsaW5rIGphdmF4Lm1lZGlhLm9w
ZW5nbC5HTEV2ZW50TGlzdGVuZXIjZGlzcGxheSBkaXNwbGF5fSBtZXRob2Qgb2YgeW91cgogICAg
e0BsaW5rIGphdmF4Lm1lZGlhLm9wZW5nbC5HTEV2ZW50TGlzdGVuZXIgR0xFdmVudExpc3RlbmVy
fSwgYWRkOgogICAgPFBSRT4KICAgIHJlbmRlcmVyLmJlZ2luUmVuZGVyaW5nKGRyYXdhYmxlLmdl
dFdpZHRoKCksIGRyYXdhYmxlLmdldEhlaWdodCgpKTsKICAgIC8vIG9wdGlvbmFsbHkgc2V0IHRo
ZSBjb2xvcgogICAgcmVuZGVyZXIuc2V0Q29sb3IoMS4wZiwgMC4yZiwgMC4yZiwgMC44Zik7CiAg
ICByZW5kZXJlci5kcmF3KCJUZXh0IHRvIGRyYXciLCB4UG9zaXRpb24sIHlQb3NpdGlvbik7CiAg
ICAvLyAuLi4gbW9yZSBkcmF3IGNvbW1hbmRzLCBjb2xvciBjaGFuZ2VzLCBldGMuCiAgICByZW5k
ZXJlci5lbmRSZW5kZXJpbmcoKTsKICAgIDwvUFJFPgoKICAgIFVubGVzcyB5b3UgYXJlIHNoYXJp
bmcgdGV4dHVyZXMgYW5kIGRpc3BsYXkgbGlzdHMgYmV0d2VlbiBPcGVuR0wKICAgIGNvbnRleHRz
LCB5b3UgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGUge0BsaW5rICNkaXNwb3NlIGRpc3Bvc2V9CiAg
ICBtZXRob2Qgb2YgdGhlIFRleHRSZW5kZXJlcjsgdGhlIE9wZW5HTCByZXNvdXJjZXMgaXQgdXNl
cwogICAgaW50ZXJuYWxseSB3aWxsIGJlIGNsZWFuZWQgdXAgYXV0b21hdGljYWxseSB3aGVuIHRo
ZSBPcGVuR0wKICAgIGNvbnRleHQgaXMgZGVzdHJveWVkLiA8UD4KCiAgICA8Yj5Ob3RlPC9iPiB0
aGF0IHRoZSBUZXh0UmVuZGVyZXIgbWF5IGNhdXNlIHRoZSB2ZXJ0ZXggYW5kIHRleHR1cmUKICAg
IGNvb3JkaW5hdGUgYXJyYXkgYnVmZmVyIGJpbmRpbmdzIHRvIGNoYW5nZSwgb3IgdG8gYmUgdW5i
b3VuZC4gVGhpcwogICAgaXMgaW1wb3J0YW50IHRvIG5vdGUgaWYgeW91IGFyZSB1c2luZyBWZXJ0
ZXggQnVmZmVyIE9iamVjdHMgKFZCT3MpCiAgICBpbiB5b3VyIGFwcGxpY2F0aW9uLiA8UD4KCiAg
ICBJbnRlcm5hbGx5LCB0aGUgcmVuZGVyZXIgdXNlcyBhIHJlY3RhbmdsZSBwYWNraW5nIGFsZ29y
aXRobSB0bwogICAgcGFjayBib3RoIGdseXBocyBhbmQgZnVsbCBTdHJpbmdzJyByZW5kZXJpbmcg
cmVzdWx0cyAod2hpY2ggYXJlCiAgICB2YXJpYWJsZSBzaXplKSBvbnRvIGEgbGFyZ2VyIE9wZW5H
TCB0ZXh0dXJlLiBUaGUgaW50ZXJuYWwgYmFja2luZwogICAgc3RvcmUgaXMgbWFpbnRhaW5lZCB1
c2luZyBhIHtAbGluawogICAgY29tLmpvZ2FtcC5vcGVuZ2wudXRpbC5hd3QuVGV4dHVyZVJlbmRl
cmVyIFRleHR1cmVSZW5kZXJlcn0uIEEgbGVhc3QKICAgIHJlY2VudGx5IHVzZWQgKExSVSkgYWxn
b3JpdGhtIGlzIHVzZWQgdG8gZGlzY2FyZCBwcmV2aW91c2x5CiAgICByZW5kZXJlZCBzdHJpbmdz
OyB0aGUgc3BlY2lmaWMgYWxnb3JpdGhtIGlzIHVuZGVmaW5lZCwgYnV0IGlzCiAgICBjdXJyZW50
bHkgaW1wbGVtZW50ZWQgYnkgZmx1c2hpbmcgdW51c2VkIFN0cmluZ3MnIHJlbmRlcmluZwogICAg
cmVzdWx0cyBldmVyeSBmZXcgaHVuZHJlZCByZW5kZXJpbmcgY3ljbGVzLCB3aGVyZSBhIHJlbmRl
cmluZwogICAgY3ljbGUgaXMgZGVmaW5lZCBhcyBhIHBhaXIgb2YgY2FsbHMgdG8ge0BsaW5rICNi
ZWdpblJlbmRlcmluZwogICAgYmVnaW5SZW5kZXJpbmd9IC8ge0BsaW5rICNlbmRSZW5kZXJpbmcg
ZW5kUmVuZGVyaW5nfS4KCiAgICBAYXV0aG9yIEpvaG4gQnVya2V5CiAgICBAYXV0aG9yIEtlbm5l
dGggUnVzc2VsbAoqLwpwdWJsaWMgY2xhc3MgVGV4dFJlbmRlcmVyIHsKICAgIHByaXZhdGUgc3Rh
dGljIGZpbmFsIGJvb2xlYW4gREVCVUc7CgogICAgc3RhdGljIHsKICAgICAgICBEZWJ1Zy5pbml0
U2luZ2xldG9uKCk7CiAgICAgICAgREVCVUcgPSBEZWJ1Zy5pc1Byb3BlcnR5RGVmaW5lZCgiam9n
bC5kZWJ1Zy5UZXh0UmVuZGVyZXIiLCB0cnVlKTsKICAgIH0KCiAgICAvLyBUaGVzZSBhcmUgb2Nj
YXNpb25hbGx5IHVzZWZ1bCBmb3IgbW9yZSBpbi1kZXB0aCBkZWJ1Z2dpbmcKICAgIHByaXZhdGUg
c3RhdGljIGZpbmFsIGJvb2xlYW4gRElTQUJMRV9HTFlQSF9DQUNIRSA9IGZhbHNlOwogICAgcHJp
dmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEUkFXX0JCT1hFUyA9IGZhbHNlOwoKICAgIHN0YXRp
YyBmaW5hbCBpbnQga1NpemUgPSAyNTY7CgogICAgLy8gRXZlcnkgY2VydGFpbiBudW1iZXIgb2Yg
cmVuZGVyIGN5Y2xlcywgZmx1c2ggdGhlIHN0cmluZ3Mgd2hpY2gKICAgIC8vIGhhdmVuJ3QgYmVl
biB1c2VkIHJlY2VudGx5CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lDTEVTX1BFUl9G
TFVTSCA9IDEwMDsKCiAgICAvLyBUaGUgYW1vdW50IG9mIHZlcnRpY2FsIGRlYWQgc3BhY2Ugb24g
dGhlIGJhY2tpbmcgc3RvcmUgYmVmb3JlIHdlCiAgICAvLyBmb3JjZSBhIGNvbXBhY3Rpb24KICAg
IHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9WRVJUSUNBTF9GUkFHTUVOVEFUSU9OID0g
MC43ZjsKICAgIHN0YXRpYyBmaW5hbCBpbnQga1F1YWRzUGVyQnVmZmVyID0gMTAwOwogICAgc3Rh
dGljIGZpbmFsIGludCBrQ29vcmRzUGVyVmVydFZlcnRzID0gMzsKICAgIHN0YXRpYyBmaW5hbCBp
bnQga0Nvb3Jkc1BlclZlcnRUZXggPSAyOwogICAgc3RhdGljIGZpbmFsIGludCBrVmVydHNQZXJR
dWFkID0gNDsKICAgIHN0YXRpYyBmaW5hbCBpbnQga1RvdGFsQnVmZmVyU2l6ZVZlcnRzID0ga1F1
YWRzUGVyQnVmZmVyICoga1ZlcnRzUGVyUXVhZDsKICAgIHN0YXRpYyBmaW5hbCBpbnQga1RvdGFs
QnVmZmVyU2l6ZUNvb3Jkc1ZlcnRzID0ga1F1YWRzUGVyQnVmZmVyICoga1ZlcnRzUGVyUXVhZCAq
IGtDb29yZHNQZXJWZXJ0VmVydHM7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNp
emVDb29yZHNUZXggPSBrUXVhZHNQZXJCdWZmZXIgKiBrVmVydHNQZXJRdWFkICoga0Nvb3Jkc1Bl
clZlcnRUZXg7CiAgICBzdGF0aWMgZmluYWwgaW50IGtUb3RhbEJ1ZmZlclNpemVCeXRlc1ZlcnRz
ID0ga1RvdGFsQnVmZmVyU2l6ZUNvb3Jkc1ZlcnRzICogNDsKICAgIHN0YXRpYyBmaW5hbCBpbnQg
a1RvdGFsQnVmZmVyU2l6ZUJ5dGVzVGV4ID0ga1RvdGFsQnVmZmVyU2l6ZUNvb3Jkc1RleCAqIDQ7
CiAgICBzdGF0aWMgZmluYWwgaW50IGtTaXplSW5CeXRlc19PbmVWZXJ0aWNlc19WZXJ0ZXhEYXRh
ID0ga0Nvb3Jkc1BlclZlcnRWZXJ0cyAqIDQ7CiAgICBzdGF0aWMgZmluYWwgaW50IGtTaXplSW5C
eXRlc19PbmVWZXJ0aWNlc19UZXhEYXRhID0ga0Nvb3Jkc1BlclZlcnRUZXggKiA0OwogICAgcHJp
dmF0ZSBmaW5hbCBGb250IGZvbnQ7CiAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYW50aWFsaWFz
ZWQ7CiAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlRnJhY3Rpb25hbE1ldHJpY3M7CgogICAg
Ly8gV2hldGhlciB3ZSdyZSBhdHRlbXB0aW5nIHRvIHVzZSBhdXRvbWF0aWMgbWlwbWFwIGdlbmVy
YXRpb24gc3VwcG9ydAogICAgcHJpdmF0ZSBib29sZWFuIG1pcG1hcDsKICAgIHByaXZhdGUgUmVj
dGFuZ2xlUGFja2VyIHBhY2tlcjsKICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlTWF4U2l6ZTsKICAg
IHByaXZhdGUgZmluYWwgUmVuZGVyRGVsZWdhdGUgcmVuZGVyRGVsZWdhdGU7CiAgICBwcml2YXRl
IFRleHR1cmVSZW5kZXJlciBjYWNoZWRCYWNraW5nU3RvcmU7CiAgICBwcml2YXRlIEdyYXBoaWNz
MkQgY2FjaGVkR3JhcGhpY3M7CiAgICBwcml2YXRlIEZvbnRSZW5kZXJDb250ZXh0IGNhY2hlZEZv
bnRSZW5kZXJDb250ZXh0OwogICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBSZWN0PiBzdHJp
bmdMb2NhdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlY3Q+KCk7CiAgICBwcml2YXRlIGZp
bmFsIEdseXBoUHJvZHVjZXIgbUdseXBoUHJvZHVjZXI7CgogICAgcHJpdmF0ZSBpbnQgbnVtUmVu
ZGVyQ3ljbGVzOwoKICAgIC8vIE5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3JlIGlu
IGEgYmVnaW5SZW5kZXJpbmcoKSAvCiAgICAvLyBlbmRSZW5kZXJpbmcoKSBjeWNsZSBzbyB3ZSBj
YW4gcmUtZW50ZXIgdGhlIGV4YWN0IHNhbWUgc3RhdGUgaWYKICAgIC8vIHdlIGhhdmUgdG8gcmVh
bGxvY2F0ZSB0aGUgYmFja2luZyBzdG9yZQogICAgcHJpdmF0ZSBib29sZWFuIGluQmVnaW5FbmRQ
YWlyOwogICAgcHJpdmF0ZSBib29sZWFuIGlzT3J0aG9Nb2RlOwogICAgcHJpdmF0ZSBpbnQgYmVn
aW5SZW5kZXJpbmdXaWR0aDsKICAgIHByaXZhdGUgaW50IGJlZ2luUmVuZGVyaW5nSGVpZ2h0Owog
ICAgcHJpdmF0ZSBib29sZWFuIGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQ7CgogICAg
Ly8gRm9yIHJlc2V0dGluZyB0aGUgY29sb3IgYWZ0ZXIgZGlzcG9zYWwgb2YgdGhlIG9sZCBiYWNr
aW5nIHN0b3JlCiAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUNhY2hlZENvbG9yOwogICAgcHJpdmF0
ZSBmbG9hdCBjYWNoZWRSOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRHOwogICAgcHJpdmF0ZSBm
bG9hdCBjYWNoZWRCOwogICAgcHJpdmF0ZSBmbG9hdCBjYWNoZWRBOwogICAgcHJpdmF0ZSBDb2xv
ciBjYWNoZWRDb2xvcjsKICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9SZXNldENvbG9yOwoKICAg
IC8vIEZvciBkZWJ1Z2dpbmcgb25seQogICAgcHJpdmF0ZSBGcmFtZSBkYmdGcmFtZTsKCiAgICAv
LyBEZWJ1Z2dpbmcgcHVycG9zZXMgb25seQogICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnZ2VkOwog
ICAgUGlwZWxpbmVkX1F1YWRSZW5kZXJlciBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyOwoKICAgIC8v
ZW16aWM6IGFkZGVkIGJvb2xlYW4gZmxhZwogICAgcHJpdmF0ZSBib29sZWFuIHVzZVZlcnRleEFy
cmF5cyA9IHRydWU7CgogICAgLy9lbXppYzogYWRkZWQgYm9vbGVhbiBmbGFnCiAgICBwcml2YXRl
IGJvb2xlYW4gaXNFeHRlbnNpb25BdmFpbGFibGVfR0xfVkVSU0lPTl8xXzU7CiAgICBwcml2YXRl
IGJvb2xlYW4gY2hlY2tGb3JfaXNFeHRlbnNpb25BdmFpbGFibGVfR0xfVkVSU0lPTl8xXzU7Cgog
ICAgLy8gV2hldGhlciBHTF9MSU5FQVIgZmlsdGVyaW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBiYWNr
aW5nIHN0b3JlCiAgICBwcml2YXRlIGJvb2xlYW4gc21vb3RoaW5nID0gdHJ1ZTsKCiAgICAvKiog
Q3JlYXRlcyBhIG5ldyBUZXh0UmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gZm9udCwgdXNpbmcgbm8K
ICAgICAgICBhbnRpYWxpYXNpbmcgb3IgZnJhY3Rpb25hbCBtZXRyaWNzLCBhbmQgdGhlIGRlZmF1
bHQKICAgICAgICBSZW5kZXJEZWxlZ2F0ZS4gRXF1aXZhbGVudCB0byA8Y29kZT5UZXh0UmVuZGVy
ZXIoZm9udCwgZmFsc2UsCiAgICAgICAgZmFsc2UpPC9jb2RlPi4KCiAgICAgICAgQHBhcmFtIGZv
bnQgdGhlIGZvbnQgdG8gcmVuZGVyIHdpdGgKICAgICovCiAgICBwdWJsaWMgVGV4dFJlbmRlcmVy
KEZvbnQgZm9udCkgewogICAgICAgIHRoaXMoZm9udCwgZmFsc2UsIGZhbHNlLCBudWxsLCBmYWxz
ZSk7CiAgICB9CgogICAgLyoqIENyZWF0ZXMgYSBuZXcgVGV4dFJlbmRlcmVyIHdpdGggdGhlIGdp
dmVuIGZvbnQsIHVzaW5nIG5vCiAgICAgICAgYW50aWFsaWFzaW5nIG9yIGZyYWN0aW9uYWwgbWV0
cmljcywgYW5kIHRoZSBkZWZhdWx0CiAgICAgICAgUmVuZGVyRGVsZWdhdGUuIElmIDxDT0RFPm1p
cG1hcDwvQ09ERT4gaXMgdHJ1ZSwgYXR0ZW1wdHMgdG8gdXNlCiAgICAgICAgT3BlbkdMJ3MgYXV0
b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uIGZvciBiZXR0ZXIgc21vb3RoaW5nIHdoZW4KICAgICAg
ICByZW5kZXJpbmcgdGhlIFRleHR1cmVSZW5kZXJlcidzIGNvbnRlbnRzIGF0IGEgZGlzdGFuY2Uu
CiAgICAgICAgRXF1aXZhbGVudCB0byA8Y29kZT5UZXh0UmVuZGVyZXIoZm9udCwgZmFsc2UsIGZh
bHNlKTwvY29kZT4uCgogICAgICAgIEBwYXJhbSBmb250IHRoZSBmb250IHRvIHJlbmRlciB3aXRo
CiAgICAgICAgQHBhcmFtIG1pcG1hcCB3aGV0aGVyIHRvIGF0dGVtcHQgdXNlIG9mIGF1dG9tYXRp
YyBtaXBtYXAgZ2VuZXJhdGlvbgogICAgKi8KICAgIHB1YmxpYyBUZXh0UmVuZGVyZXIoRm9udCBm
b250LCBib29sZWFuIG1pcG1hcCkgewogICAgICAgIHRoaXMoZm9udCwgZmFsc2UsIGZhbHNlLCBu
dWxsLCBtaXBtYXApOwogICAgfQoKICAgIC8qKiBDcmVhdGVzIGEgbmV3IFRleHRSZW5kZXJlciB3
aXRoIHRoZSBnaXZlbiBGb250LCBzcGVjaWZpZWQgZm9udAogICAgICAgIHByb3BlcnRpZXMsIGFu
ZCBkZWZhdWx0IFJlbmRlckRlbGVnYXRlLiBUaGUKICAgICAgICA8Y29kZT5hbnRpYWxpYXNlZDwv
Y29kZT4gYW5kIDxjb2RlPnVzZUZyYWN0aW9uYWxNZXRyaWNzPC9jb2RlPgogICAgICAgIGZsYWdz
IHByb3ZpZGUgY29udHJvbCBvdmVyIHRoZSBzYW1lIHByb3BlcnRpZXMgYXQgdGhlIEphdmEgMkQK
ICAgICAgICBsZXZlbC4gTm8gbWlwbWFwIHN1cHBvcnQgaXMgcmVxdWVzdGVkLiBFcXVpdmFsZW50
IHRvCiAgICAgICAgPGNvZGU+VGV4dFJlbmRlcmVyKGZvbnQsIGFudGlhbGlhc2VkLCB1c2VGcmFj
dGlvbmFsTWV0cmljcywKICAgICAgICBudWxsKTwvY29kZT4uCgogICAgICAgIEBwYXJhbSBmb250
IHRoZSBmb250IHRvIHJlbmRlciB3aXRoCiAgICAgICAgQHBhcmFtIGFudGlhbGlhc2VkIHdoZXRo
ZXIgdG8gdXNlIGFudGlhbGlhc2VkIGZvbnRzCiAgICAgICAgQHBhcmFtIHVzZUZyYWN0aW9uYWxN
ZXRyaWNzIHdoZXRoZXIgdG8gdXNlIGZyYWN0aW9uYWwgZm9udAogICAgICAgIG1ldHJpY3MgYXQg
dGhlIEphdmEgMkQgbGV2ZWwKICAgICovCiAgICBwdWJsaWMgVGV4dFJlbmRlcmVyKEZvbnQgZm9u
dCwgYm9vbGVhbiBhbnRpYWxpYXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1
c2VGcmFjdGlvbmFsTWV0cmljcykgewogICAgICAgIHRoaXMoZm9udCwgYW50aWFsaWFzZWQsIHVz
ZUZyYWN0aW9uYWxNZXRyaWNzLCBudWxsLCBmYWxzZSk7CiAgICB9CgogICAgLyoqIENyZWF0ZXMg
YSBuZXcgVGV4dFJlbmRlcmVyIHdpdGggdGhlIGdpdmVuIEZvbnQsIHNwZWNpZmllZCBmb250CiAg
ICAgICAgcHJvcGVydGllcywgYW5kIGdpdmVuIFJlbmRlckRlbGVnYXRlLiBUaGUKICAgICAgICA8
Y29kZT5hbnRpYWxpYXNlZDwvY29kZT4gYW5kIDxjb2RlPnVzZUZyYWN0aW9uYWxNZXRyaWNzPC9j
b2RlPgogICAgICAgIGZsYWdzIHByb3ZpZGUgY29udHJvbCBvdmVyIHRoZSBzYW1lIHByb3BlcnRp
ZXMgYXQgdGhlIEphdmEgMkQKICAgICAgICBsZXZlbC4gVGhlIDxjb2RlPnJlbmRlckRlbGVnYXRl
PC9jb2RlPiBwcm92aWRlcyBtb3JlIGNvbnRyb2wKICAgICAgICBvdmVyIHRoZSB0ZXh0IHJlbmRl
cmVkLiBObyBtaXBtYXAgc3VwcG9ydCBpcyByZXF1ZXN0ZWQuCgogICAgICAgIEBwYXJhbSBmb250
IHRoZSBmb250IHRvIHJlbmRlciB3aXRoCiAgICAgICAgQHBhcmFtIGFudGlhbGlhc2VkIHdoZXRo
ZXIgdG8gdXNlIGFudGlhbGlhc2VkIGZvbnRzCiAgICAgICAgQHBhcmFtIHVzZUZyYWN0aW9uYWxN
ZXRyaWNzIHdoZXRoZXIgdG8gdXNlIGZyYWN0aW9uYWwgZm9udAogICAgICAgIG1ldHJpY3MgYXQg
dGhlIEphdmEgMkQgbGV2ZWwKICAgICAgICBAcGFyYW0gcmVuZGVyRGVsZWdhdGUgdGhlIHJlbmRl
ciBkZWxlZ2F0ZSB0byB1c2UgdG8gZHJhdyB0aGUKICAgICAgICB0ZXh0J3MgYml0bWFwLCBvciBu
dWxsIHRvIHVzZSB0aGUgZGVmYXVsdCBvbmUKICAgICovCiAgICBwdWJsaWMgVGV4dFJlbmRlcmVy
KEZvbnQgZm9udCwgYm9vbGVhbiBhbnRpYWxpYXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAg
Ym9vbGVhbiB1c2VGcmFjdGlvbmFsTWV0cmljcywgUmVuZGVyRGVsZWdhdGUgcmVuZGVyRGVsZWdh
dGUpIHsKICAgICAgICB0aGlzKGZvbnQsIGFudGlhbGlhc2VkLCB1c2VGcmFjdGlvbmFsTWV0cmlj
cywgcmVuZGVyRGVsZWdhdGUsIGZhbHNlKTsKICAgIH0KCiAgICAvKiogQ3JlYXRlcyBhIG5ldyBU
ZXh0UmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gRm9udCwgc3BlY2lmaWVkIGZvbnQKICAgICAgICBw
cm9wZXJ0aWVzLCBhbmQgZ2l2ZW4gUmVuZGVyRGVsZWdhdGUuIFRoZQogICAgICAgIDxjb2RlPmFu
dGlhbGlhc2VkPC9jb2RlPiBhbmQgPGNvZGU+dXNlRnJhY3Rpb25hbE1ldHJpY3M8L2NvZGU+CiAg
ICAgICAgZmxhZ3MgcHJvdmlkZSBjb250cm9sIG92ZXIgdGhlIHNhbWUgcHJvcGVydGllcyBhdCB0
aGUgSmF2YSAyRAogICAgICAgIGxldmVsLiBUaGUgPGNvZGU+cmVuZGVyRGVsZWdhdGU8L2NvZGU+
IHByb3ZpZGVzIG1vcmUgY29udHJvbAogICAgICAgIG92ZXIgdGhlIHRleHQgcmVuZGVyZWQuIElm
IDxDT0RFPm1pcG1hcDwvQ09ERT4gaXMgdHJ1ZSwgYXR0ZW1wdHMKICAgICAgICB0byB1c2UgT3Bl
bkdMJ3MgYXV0b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uIGZvciBiZXR0ZXIgc21vb3RoaW5nCiAg
ICAgICAgd2hlbiByZW5kZXJpbmcgdGhlIFRleHR1cmVSZW5kZXJlcidzIGNvbnRlbnRzIGF0IGEg
ZGlzdGFuY2UuCgogICAgICAgIEBwYXJhbSBmb250IHRoZSBmb250IHRvIHJlbmRlciB3aXRoCiAg
ICAgICAgQHBhcmFtIGFudGlhbGlhc2VkIHdoZXRoZXIgdG8gdXNlIGFudGlhbGlhc2VkIGZvbnRz
CiAgICAgICAgQHBhcmFtIHVzZUZyYWN0aW9uYWxNZXRyaWNzIHdoZXRoZXIgdG8gdXNlIGZyYWN0
aW9uYWwgZm9udAogICAgICAgIG1ldHJpY3MgYXQgdGhlIEphdmEgMkQgbGV2ZWwKICAgICAgICBA
cGFyYW0gcmVuZGVyRGVsZWdhdGUgdGhlIHJlbmRlciBkZWxlZ2F0ZSB0byB1c2UgdG8gZHJhdyB0
aGUKICAgICAgICB0ZXh0J3MgYml0bWFwLCBvciBudWxsIHRvIHVzZSB0aGUgZGVmYXVsdCBvbmUK
ICAgICAgICBAcGFyYW0gbWlwbWFwIHdoZXRoZXIgdG8gYXR0ZW1wdCB1c2Ugb2YgYXV0b21hdGlj
IG1pcG1hcCBnZW5lcmF0aW9uCiAgICAqLwogICAgcHVibGljIFRleHRSZW5kZXJlcihGb250IGZv
bnQsIGJvb2xlYW4gYW50aWFsaWFzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4g
dXNlRnJhY3Rpb25hbE1ldHJpY3MsIFJlbmRlckRlbGVnYXRlIHJlbmRlckRlbGVnYXRlLAogICAg
ICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1pcG1hcCkgewogICAgICAgIHRoaXMuZm9udCA9
IGZvbnQ7CiAgICAgICAgdGhpcy5hbnRpYWxpYXNlZCA9IGFudGlhbGlhc2VkOwogICAgICAgIHRo
aXMudXNlRnJhY3Rpb25hbE1ldHJpY3MgPSB1c2VGcmFjdGlvbmFsTWV0cmljczsKICAgICAgICB0
aGlzLm1pcG1hcCA9IG1pcG1hcDsKCiAgICAgICAgLy8gRklYTUU6IGNvbnNpZGVyIGFkanVzdGlu
ZyB0aGUgc2l6ZSBiYXNlZCBvbiBmb250IHNpemUKICAgICAgICAvLyAoaXQgd2lsbCBhbHJlYWR5
IGF1dG9tYXRpY2FsbHkgcmVzaXplIGlmIG5lY2Vzc2FyeSkKICAgICAgICBwYWNrZXIgPSBuZXcg
UmVjdGFuZ2xlUGFja2VyKG5ldyBNYW5hZ2VyKCksIGtTaXplLCBrU2l6ZSk7CgogICAgICAgIGlm
IChyZW5kZXJEZWxlZ2F0ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJlbmRlckRlbGVnYXRlID0g
bmV3IERlZmF1bHRSZW5kZXJEZWxlZ2F0ZSgpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5yZW5k
ZXJEZWxlZ2F0ZSA9IHJlbmRlckRlbGVnYXRlOwoKICAgICAgICBtR2x5cGhQcm9kdWNlciA9IG5l
dyBHbHlwaFByb2R1Y2VyKGZvbnQuZ2V0TnVtR2x5cGhzKCkpOwogICAgfQoKICAgIC8qKiBSZXR1
cm5zIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIGdpdmVuIFN0cmluZywgYXNzdW1pbmcg
aXQKICAgICAgICB3YXMgcmVuZGVyZWQgYXQgdGhlIG9yaWdpbi4gU2VlIHtAbGluayAjZ2V0Qm91
bmRzKENoYXJTZXF1ZW5jZSkKICAgICAgICBnZXRCb3VuZHMoQ2hhclNlcXVlbmNlKX0uICovCiAg
ICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKFN0cmluZyBzdHIpIHsKICAgICAgICByZXR1
cm4gZ2V0Qm91bmRzKChDaGFyU2VxdWVuY2UpIHN0cik7CiAgICB9CgogICAgLyoqIFJldHVybnMg
dGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgZ2l2ZW4gQ2hhclNlcXVlbmNlLAogICAgICAg
IGFzc3VtaW5nIGl0IHdhcyByZW5kZXJlZCBhdCB0aGUgb3JpZ2luLiBUaGUgY29vcmRpbmF0ZSBz
eXN0ZW0gb2YKICAgICAgICB0aGUgcmV0dXJuZWQgcmVjdGFuZ2xlIGlzIEphdmEgMkQncywgd2l0
aCBpbmNyZWFzaW5nIFkKICAgICAgICBjb29yZGluYXRlcyBpbiB0aGUgZG93bndhcmQgZGlyZWN0
aW9uLiBUaGUgcmVsYXRpdmUgY29vcmRpbmF0ZQogICAgICAgICgwLCAwKSBpbiB0aGUgcmV0dXJu
ZWQgcmVjdGFuZ2xlIGNvcnJlc3BvbmRzIHRvIHRoZSBiYXNlbGluZSBvZgogICAgICAgIHRoZSBs
ZWZ0bW9zdCBjaGFyYWN0ZXIgb2YgdGhlIHJlbmRlcmVkIHN0cmluZywgaW4gc2ltaWxhcgogICAg
ICAgIGZhc2hpb24gdG8gdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnksIGZvciBleGFtcGxlLCB7QGxp
bmsKICAgICAgICBqYXZhLmF3dC5mb250LkdseXBoVmVjdG9yI2dldFZpc3VhbEJvdW5kc30uIE1v
c3QgYXBwbGljYXRpb25zCiAgICAgICAgd2lsbCB1c2Ugb25seSB0aGUgd2lkdGggYW5kIGhlaWdo
dCBvZiB0aGUgcmV0dXJuZWQgUmVjdGFuZ2xlIGZvcgogICAgICAgIHRoZSBwdXJwb3NlcyBvZiBj
ZW50ZXJpbmcgb3IganVzdGlmeWluZyB0aGUgU3RyaW5nLiBJdCBpcyBub3QKICAgICAgICBzcGVj
aWZpZWQgd2hpY2ggSmF2YSAyRCBib3VuZHMgKHtAbGluawogICAgICAgIGphdmEuYXd0LmZvbnQu
R2x5cGhWZWN0b3IjZ2V0VmlzdWFsQm91bmRzIGdldFZpc3VhbEJvdW5kc30sCiAgICAgICAge0Bs
aW5rIGphdmEuYXd0LmZvbnQuR2x5cGhWZWN0b3IjZ2V0UGl4ZWxCb3VuZHMgZ2V0UGl4ZWxCb3Vu
ZHN9LAogICAgICAgIGV0Yy4pIHRoZSByZXR1cm5lZCBib3VuZHMgY29ycmVzcG9uZCB0bywgYWx0
aG91Z2ggZXZlcnkgZWZmb3J0CiAgICAgICAgaXMgbWFkZSB0byBlbnN1cmUgYW4gYWNjdXJhdGUg
Ym91bmQuICovCiAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzKENoYXJTZXF1ZW5jZSBz
dHIpIHsKICAgICAgICAvLyBGSVhNRTogdGhpcyBzaG91bGQgYmUgbW9yZSBvcHRpbWl6ZWQgYW5k
IHVzZSB0aGUgZ2x5cGggY2FjaGUKICAgICAgICBSZWN0IHIgPSBzdHJpbmdMb2NhdGlvbnMuZ2V0
KHN0cik7CgogICAgICAgIGlmIChyICE9IG51bGwpIHsKICAgICAgICAgICAgVGV4dERhdGEgZGF0
YSA9IChUZXh0RGF0YSkgci5nZXRVc2VyRGF0YSgpOwoKICAgICAgICAgICAgLy8gUmVjb25zdGl0
dXRlIHRoZSBKYXZhIDJEIHJlc3VsdHMgYmFzZWQgb24gdGhlIGNhY2hlZCB2YWx1ZXMKICAgICAg
ICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUoLWRhdGEub3JpZ2luKCkueCwgLWRh
dGEub3JpZ2luKCkueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ci53KCksIHIuaCgpKTsKICAgICAgICB9CgogICAgICAgIC8vIE11c3QgcmV0dXJuIGEgUmVjdGFu
Z2xlIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF5b3V0IGFsZ29yaXRobSAtLQogICAgICAgIC8vIG11
c3QgYmUgaWRlbXBvdGVudAogICAgICAgIHJldHVybiBub3JtYWxpemUocmVuZGVyRGVsZWdhdGUu
Z2V0Qm91bmRzKHN0ciwgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBnZXRGb250UmVuZGVyQ29udGV4dCgpKSk7CiAgICB9CgogICAgLyoqIFJl
dHVybnMgdGhlIEZvbnQgdGhpcyByZW5kZXJlciBpcyB1c2luZy4gKi8KICAgIHB1YmxpYyBGb250
IGdldEZvbnQoKSB7CiAgICAgICAgcmV0dXJuIGZvbnQ7CiAgICB9CgogICAgLyoqIFJldHVybnMg
YSBGb250UmVuZGVyQ29udGV4dCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZXh0ZXJuYWwKICAgICAg
ICB0ZXh0LXJlbGF0ZWQgc2l6ZSBjb21wdXRhdGlvbnMuIFRoaXMgb2JqZWN0IHNob3VsZCBiZSBj
b25zaWRlcmVkCiAgICAgICAgdHJhbnNpZW50IGFuZCBtYXkgYmVjb21lIGludmFsaWRhdGVkIGJl
dHdlZW4ge0BsaW5rCiAgICAgICAgI2JlZ2luUmVuZGVyaW5nIGJlZ2luUmVuZGVyaW5nfSAvIHtA
bGluayAjZW5kUmVuZGVyaW5nCiAgICAgICAgZW5kUmVuZGVyaW5nfSBwYWlycy4gKi8KICAgIHB1
YmxpYyBGb250UmVuZGVyQ29udGV4dCBnZXRGb250UmVuZGVyQ29udGV4dCgpIHsKICAgICAgICBp
ZiAoY2FjaGVkRm9udFJlbmRlckNvbnRleHQgPT0gbnVsbCkgewogICAgICAgICAgICBjYWNoZWRG
b250UmVuZGVyQ29udGV4dCA9IGdldEdyYXBoaWNzMkQoKS5nZXRGb250UmVuZGVyQ29udGV4dCgp
OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNhY2hlZEZvbnRSZW5kZXJDb250ZXh0OwogICAg
fQoKICAgIC8qKiBCZWdpbnMgcmVuZGVyaW5nIHdpdGggdGhpcyB7QGxpbmsgVGV4dFJlbmRlcmVy
IFRleHRSZW5kZXJlcn0KICAgICAgICBpbnRvIHRoZSBjdXJyZW50IE9wZW5HTCBkcmF3YWJsZSwg
cHVzaGluZyB0aGUgcHJvamVjdGlvbiBhbmQKICAgICAgICBtb2RlbHZpZXcgbWF0cmljZXMgYW5k
IHNvbWUgc3RhdGUgYml0cyBhbmQgc2V0dGluZyB1cCBhCiAgICAgICAgdHdvLWRpbWVuc2lvbmFs
IG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIHdpdGggKDAsIDApIGFzIHRoZQogICAgICAgIGxvd2Vy
LWxlZnQgY29vcmRpbmF0ZSBhbmQgKHdpZHRoLCBoZWlnaHQpIGFzIHRoZSB1cHBlci1yaWdodAog
ICAgICAgIGNvb3JkaW5hdGUuIEJpbmRzIGFuZCBlbmFibGVzIHRoZSBpbnRlcm5hbCBPcGVuR0wg
dGV4dHVyZQogICAgICAgIG9iamVjdCwgc2V0cyB0aGUgdGV4dHVyZSBlbnZpcm9ubWVudCBtb2Rl
IHRvIEdMX01PRFVMQVRFLCBhbmQKICAgICAgICBjaGFuZ2VzIHRoZSBjdXJyZW50IGNvbG9yIHRv
IHRoZSBsYXN0IGNvbG9yIHNldCB3aXRoIHRoaXMKICAgICAgICBUZXh0UmVuZGVyZXIgdmlhIHtA
bGluayAjc2V0Q29sb3Igc2V0Q29sb3J9LiBUaGlzIG1ldGhvZAogICAgICAgIGRpc2FibGVzIHRo
ZSBkZXB0aCB0ZXN0IGFuZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgICAgYmVnaW5SZW5kZXJpbmco
d2lkdGgsIGhlaWdodCwgdHJ1ZSkuCgogICAgICAgIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2Yg
dGhlIGN1cnJlbnQgb24tc2NyZWVuIE9wZW5HTCBkcmF3YWJsZQogICAgICAgIEBwYXJhbSBoZWln
aHQgdGhlIGhlaWdodCBvZiB0aGUgY3VycmVudCBvbi1zY3JlZW4gT3BlbkdMIGRyYXdhYmxlCiAg
ICAgICAgQHRocm93cyBqYXZheC5tZWRpYS5vcGVuZ2wuR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdM
IGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICov
CiAgICBwdWJsaWMgdm9pZCBiZWdpblJlbmRlcmluZyhpbnQgd2lkdGgsIGludCBoZWlnaHQpIHRo
cm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgYmVnaW5SZW5kZXJpbmcod2lkdGgsIGhlaWdodCwg
dHJ1ZSk7CiAgICB9CgogICAgLyoqIEJlZ2lucyByZW5kZXJpbmcgd2l0aCB0aGlzIHtAbGluayBU
ZXh0UmVuZGVyZXIgVGV4dFJlbmRlcmVyfQogICAgICAgIGludG8gdGhlIGN1cnJlbnQgT3BlbkdM
IGRyYXdhYmxlLCBwdXNoaW5nIHRoZSBwcm9qZWN0aW9uIGFuZAogICAgICAgIG1vZGVsdmlldyBt
YXRyaWNlcyBhbmQgc29tZSBzdGF0ZSBiaXRzIGFuZCBzZXR0aW5nIHVwIGEKICAgICAgICB0d28t
ZGltZW5zaW9uYWwgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gd2l0aCAoMCwgMCkgYXMgdGhlCiAg
ICAgICAgbG93ZXItbGVmdCBjb29yZGluYXRlIGFuZCAod2lkdGgsIGhlaWdodCkgYXMgdGhlIHVw
cGVyLXJpZ2h0CiAgICAgICAgY29vcmRpbmF0ZS4gQmluZHMgYW5kIGVuYWJsZXMgdGhlIGludGVy
bmFsIE9wZW5HTCB0ZXh0dXJlCiAgICAgICAgb2JqZWN0LCBzZXRzIHRoZSB0ZXh0dXJlIGVudmly
b25tZW50IG1vZGUgdG8gR0xfTU9EVUxBVEUsIGFuZAogICAgICAgIGNoYW5nZXMgdGhlIGN1cnJl
bnQgY29sb3IgdG8gdGhlIGxhc3QgY29sb3Igc2V0IHdpdGggdGhpcwogICAgICAgIFRleHRSZW5k
ZXJlciB2aWEge0BsaW5rICNzZXRDb2xvciBzZXRDb2xvcn0uIERpc2FibGVzIHRoZSBkZXB0aAog
ICAgICAgIHRlc3QgaWYgdGhlIGRpc2FibGVEZXB0aFRlc3QgYXJndW1lbnQgaXMgdHJ1ZS4KCiAg
ICAgICAgQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgY3VycmVudCBvbi1zY3JlZW4gT3Bl
bkdMIGRyYXdhYmxlCiAgICAgICAgQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBjdXJy
ZW50IG9uLXNjcmVlbiBPcGVuR0wgZHJhd2FibGUKICAgICAgICBAcGFyYW0gZGlzYWJsZURlcHRo
VGVzdCB3aGV0aGVyIHRvIGRpc2FibGUgdGhlIGRlcHRoIHRlc3QKICAgICAgICBAdGhyb3dzIEdM
RXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBt
ZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQgYmVnaW5SZW5kZXJpbmcoaW50
IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIGRpc2FibGVEZXB0aFRlc3QpCiAgICAgICAgdGhy
b3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBiZWdpblJlbmRlcmluZyh0cnVlLCB3aWR0aCwgaGVp
Z2h0LCBkaXNhYmxlRGVwdGhUZXN0KTsKICAgIH0KCiAgICAvKiogQmVnaW5zIHJlbmRlcmluZyBv
ZiAyRCB0ZXh0IGluIDNEIHdpdGggdGhpcyB7QGxpbmsgVGV4dFJlbmRlcmVyCiAgICAgICAgVGV4
dFJlbmRlcmVyfSBpbnRvIHRoZSBjdXJyZW50IE9wZW5HTCBkcmF3YWJsZS4gQXNzdW1lcyB0aGUg
ZW5kCiAgICAgICAgdXNlciBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB1cCB0aGUgbW9kZWx2
aWV3IGFuZCBwcm9qZWN0aW9uCiAgICAgICAgbWF0cmljZXMsIGFuZCB3aWxsIHJlbmRlciB0ZXh0
IHVzaW5nIHRoZSB7QGxpbmsgI2RyYXczRCBkcmF3M0R9CiAgICAgICAgbWV0aG9kLiBUaGlzIG1l
dGhvZCBwdXNoZXMgc29tZSBPcGVuR0wgc3RhdGUgYml0cywgYmluZHMgYW5kCiAgICAgICAgZW5h
YmxlcyB0aGUgaW50ZXJuYWwgT3BlbkdMIHRleHR1cmUgb2JqZWN0LCBzZXRzIHRoZSB0ZXh0dXJl
CiAgICAgICAgZW52aXJvbm1lbnQgbW9kZSB0byBHTF9NT0RVTEFURSwgYW5kIGNoYW5nZXMgdGhl
IGN1cnJlbnQgY29sb3IKICAgICAgICB0byB0aGUgbGFzdCBjb2xvciBzZXQgd2l0aCB0aGlzIFRl
eHRSZW5kZXJlciB2aWEge0BsaW5rCiAgICAgICAgI3NldENvbG9yIHNldENvbG9yfS4KCiAgICAg
ICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVu
dCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lkIGJlZ2lu
M0RSZW5kZXJpbmcoKSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGJlZ2luUmVuZGVyaW5n
KGZhbHNlLCAwLCAwLCBmYWxzZSk7CiAgICB9CgogICAgLyoqIENoYW5nZXMgdGhlIGN1cnJlbnQg
Y29sb3Igb2YgdGhpcyBUZXh0UmVuZGVyZXIgdG8gdGhlIHN1cHBsaWVkCiAgICAgICAgb25lLiBU
aGUgZGVmYXVsdCBjb2xvciBpcyBvcGFxdWUgd2hpdGUuCgogICAgICAgIEBwYXJhbSBjb2xvciB0
aGUgbmV3IGNvbG9yIHRvIHVzZSBmb3IgcmVuZGVyaW5nIHRleHQKICAgICAgICBAdGhyb3dzIEdM
RXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBt
ZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgY29s
b3IpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgYm9vbGVhbiBub05lZWRGb3JGbHVzaCA9
IChoYXZlQ2FjaGVkQ29sb3IgJiYgKGNhY2hlZENvbG9yICE9IG51bGwpICYmCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb2xvci5lcXVhbHMoY2FjaGVkQ29sb3IpKTsKCiAgICAg
ICAgaWYgKCFub05lZWRGb3JGbHVzaCkgewogICAgICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUo
KTsKICAgICAgICB9CgogICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLnNldENvbG9yKGNvbG9yKTsK
ICAgICAgICBoYXZlQ2FjaGVkQ29sb3IgPSB0cnVlOwogICAgICAgIGNhY2hlZENvbG9yID0gY29s
b3I7CiAgICB9CgogICAgLyoqIENoYW5nZXMgdGhlIGN1cnJlbnQgY29sb3Igb2YgdGhpcyBUZXh0
UmVuZGVyZXIgdG8gdGhlIHN1cHBsaWVkCiAgICAgICAgb25lLCB3aGVyZSBlYWNoIGNvbXBvbmVu
dCByYW5nZXMgZnJvbSAwLjBmIC0gMS4wZi4gVGhlIGFscGhhCiAgICAgICAgY29tcG9uZW50LCBp
ZiB1c2VkLCBkb2VzIG5vdCBuZWVkIHRvIGJlIHByZW11bHRpcGxpZWQgaW50byB0aGUKICAgICAg
ICBjb2xvciBjaGFubmVscyBhcyBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHtA
bGluawogICAgICAgIGNvbS5qb2dhbXAub3BlbmdsLnV0aWwudGV4dHVyZS5UZXh0dXJlIFRleHR1
cmV9LCBhbHRob3VnaAogICAgICAgIHByZW11bHRpcGxpZWQgY29sb3JzIGFyZSB1c2VkIGludGVy
bmFsbHkuIFRoZSBkZWZhdWx0IGNvbG9yIGlzCiAgICAgICAgb3BhcXVlIHdoaXRlLgoKICAgICAg
ICBAcGFyYW0gciB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgbmV3IGNvbG9yCiAgICAgICAgQHBh
cmFtIGcgdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgbmV3IGNvbG9yCiAgICAgICAgQHBhcmFt
IGIgdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3IKICAgICAgICBAcGFyYW0gYSB0
aGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSBuZXcgY29sb3IsIDAuMGYgPSBjb21wbGV0ZWx5CiAg
ICAgICAgdHJhbnNwYXJlbnQsIDEuMGYgPSBjb21wbGV0ZWx5IG9wYXF1ZQogICAgICAgIEB0aHJv
d3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMgbm90IGN1cnJlbnQgd2hlbiB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihmbG9h
dCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQogICAgICAgIHRocm93cyBHTEV4Y2VwdGlv
biB7CiAgICAgICAgYm9vbGVhbiBub05lZWRGb3JGbHVzaCA9IChoYXZlQ2FjaGVkQ29sb3IgJiYg
KGNhY2hlZENvbG9yID09IG51bGwpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAociA9PSBjYWNoZWRSKSAmJiAoZyA9PSBjYWNoZWRHKSAmJiAoYiA9PSBjYWNoZWRCKSAmJgog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgPT0gY2FjaGVkQSkpOwoKICAgICAg
ICBpZiAoIW5vTmVlZEZvckZsdXNoKSB7CiAgICAgICAgICAgIGZsdXNoR2x5cGhQaXBlbGluZSgp
OwogICAgICAgIH0KCiAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuc2V0Q29sb3IociwgZywgYiwg
YSk7CiAgICAgICAgaGF2ZUNhY2hlZENvbG9yID0gdHJ1ZTsKICAgICAgICBjYWNoZWRSID0gcjsK
ICAgICAgICBjYWNoZWRHID0gZzsKICAgICAgICBjYWNoZWRCID0gYjsKICAgICAgICBjYWNoZWRB
ID0gYTsKICAgICAgICBjYWNoZWRDb2xvciA9IG51bGw7CiAgICB9CgogICAgLyoqIERyYXdzIHRo
ZSBzdXBwbGllZCBDaGFyU2VxdWVuY2UgYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gdXNpbmcKICAg
ICAgICB0aGUgcmVuZGVyZXIncyBjdXJyZW50IGNvbG9yLiBUaGUgYmFzZWxpbmUgb2YgdGhlIGxl
ZnRtb3N0CiAgICAgICAgY2hhcmFjdGVyIGlzIGF0IHBvc2l0aW9uICh4LCB5KSBzcGVjaWZpZWQg
aW4gT3BlbkdMIGNvb3JkaW5hdGVzLAogICAgICAgIHdoZXJlIHRoZSBvcmlnaW4gaXMgYXQgdGhl
IGxvd2VyLWxlZnQgb2YgdGhlIGRyYXdhYmxlIGFuZCB0aGUgWQogICAgICAgIGNvb3JkaW5hdGUg
aW5jcmVhc2VzIGluIHRoZSB1cHdhcmQgZGlyZWN0aW9uLgoKICAgICAgICBAcGFyYW0gc3RyIHRo
ZSBzdHJpbmcgdG8gZHJhdwogICAgICAgIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgYXQgd2hp
Y2ggdG8gZHJhdwogICAgICAgIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgYXQgd2hpY2ggdG8g
ZHJhdwogICAgICAgIEB0aHJvd3MgR0xFeGNlcHRpb24gSWYgYW4gT3BlbkdMIGNvbnRleHQgaXMg
bm90IGN1cnJlbnQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKICAgICovCiAgICBwdWJsaWMg
dm9pZCBkcmF3KENoYXJTZXF1ZW5jZSBzdHIsIGludCB4LCBpbnQgeSkgdGhyb3dzIEdMRXhjZXB0
aW9uIHsKICAgICAgICBkcmF3M0Qoc3RyLCB4LCB5LCAwLCAxKTsKICAgIH0KCiAgICAvKiogRHJh
d3MgdGhlIHN1cHBsaWVkIFN0cmluZyBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiB1c2luZyB0aGUK
ICAgICAgICByZW5kZXJlcidzIGN1cnJlbnQgY29sb3IuIFNlZSB7QGxpbmsgI2RyYXcoQ2hhclNl
cXVlbmNlLCBpbnQsCiAgICAgICAgaW50KSBkcmF3KENoYXJTZXF1ZW5jZSwgaW50LCBpbnQpfS4g
Ki8KICAgIHB1YmxpYyB2b2lkIGRyYXcoU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KSB0aHJvd3Mg
R0xFeGNlcHRpb24gewogICAgICAgIGRyYXczRChzdHIsIHgsIHksIDAsIDEpOwogICAgfQoKICAg
IC8qKiBEcmF3cyB0aGUgc3VwcGxpZWQgQ2hhclNlcXVlbmNlIGF0IHRoZSBkZXNpcmVkIDNEIGxv
Y2F0aW9uIHVzaW5nCiAgICAgICAgdGhlIHJlbmRlcmVyJ3MgY3VycmVudCBjb2xvci4gVGhlIGJh
c2VsaW5lIG9mIHRoZSBsZWZ0bW9zdAogICAgICAgIGNoYXJhY3RlciBpcyBwbGFjZWQgYXQgcG9z
aXRpb24gKHgsIHksIHopIGluIHRoZSBjdXJyZW50CiAgICAgICAgY29vcmRpbmF0ZSBzeXN0ZW0u
CgogICAgICAgIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBkcmF3CiAgICAgICAgQHBhcmFtIHgg
dGhlIHggY29vcmRpbmF0ZSBhdCB3aGljaCB0byBkcmF3CiAgICAgICAgQHBhcmFtIHkgdGhlIHkg
Y29vcmRpbmF0ZSBhdCB3aGljaCB0byBkcmF3CiAgICAgICAgQHBhcmFtIHogdGhlIHogY29vcmRp
bmF0ZSBhdCB3aGljaCB0byBkcmF3CiAgICAgICAgQHBhcmFtIHNjYWxlRmFjdG9yIGEgdW5pZm9y
bSBzY2FsZSBmYWN0b3IgYXBwbGllZCB0byB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZHJh
d24gcmVjdGFuZ2xlCiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29u
dGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAg
IHB1YmxpYyB2b2lkIGRyYXczRChDaGFyU2VxdWVuY2Ugc3RyLCBmbG9hdCB4LCBmbG9hdCB5LCBm
bG9hdCB6LAogICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlRmFjdG9yKSB7CiAgICAg
ICAgaW50ZXJuYWxfZHJhdzNEKHN0ciwgeCwgeSwgeiwgc2NhbGVGYWN0b3IpOwogICAgfQoKICAg
IC8qKiBEcmF3cyB0aGUgc3VwcGxpZWQgU3RyaW5nIGF0IHRoZSBkZXNpcmVkIDNEIGxvY2F0aW9u
IHVzaW5nIHRoZQogICAgICAgIHJlbmRlcmVyJ3MgY3VycmVudCBjb2xvci4gU2VlIHtAbGluayAj
ZHJhdzNEKENoYXJTZXF1ZW5jZSwKICAgICAgICBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkg
ZHJhdzNEKENoYXJTZXF1ZW5jZSwgZmxvYXQsIGZsb2F0LAogICAgICAgIGZsb2F0LCBmbG9hdCl9
LiAqLwogICAgcHVibGljIHZvaWQgZHJhdzNEKFN0cmluZyBzdHIsIGZsb2F0IHgsIGZsb2F0IHks
IGZsb2F0IHosIGZsb2F0IHNjYWxlRmFjdG9yKSB7CiAgICAgICAgaW50ZXJuYWxfZHJhdzNEKHN0
ciwgeCwgeSwgeiwgc2NhbGVGYWN0b3IpOwogICAgfQoKICAgIC8qKiBSZXR1cm5zIHRoZSBwaXhl
bCB3aWR0aCBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyLiAqLwogICAgcHVibGljIGZsb2F0IGdldENo
YXJXaWR0aChjaGFyIGluQ2hhcikgewogICAgICAgIHJldHVybiBtR2x5cGhQcm9kdWNlci5nZXRH
bHlwaFBpeGVsV2lkdGgoaW5DaGFyKTsKICAgIH0KCiAgICAvKiogQ2F1c2VzIHRoZSBUZXh0UmVu
ZGVyZXIgdG8gZmx1c2ggYW55IGludGVybmFsIGNhY2hlcyBpdCBtYXkgYmUKICAgICAgICBtYWlu
dGFpbmluZyBhbmQgZHJhdyBpdHMgcmVuZGVyaW5nIHJlc3VsdHMgdG8gdGhlIHNjcmVlbi4gVGhp
cwogICAgICAgIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBjYWxsIHRvIGRyYXcoKSBpZiB5
b3UgYXJlIHNldHRpbmcKICAgICAgICBPcGVuR0wgc3RhdGUgc3VjaCBhcyB0aGUgbW9kZWx2aWV3
IG1hdHJpeCBiZXR3ZWVuIGNhbGxzIHRvCiAgICAgICAgZHJhdygpLiAqLwogICAgcHVibGljIHZv
aWQgZmx1c2goKSB7CiAgICAgICAgZmx1c2hHbHlwaFBpcGVsaW5lKCk7CiAgICB9CgogICAgLyoq
IEVuZHMgYSByZW5kZXIgY3ljbGUgd2l0aCB0aGlzIHtAbGluayBUZXh0UmVuZGVyZXIgVGV4dFJl
bmRlcmVyfS4KICAgICAgICBSZXN0b3JlcyB0aGUgcHJvamVjdGlvbiBhbmQgbW9kZWx2aWV3IG1h
dHJpY2VzIGFzIHdlbGwgYXMKICAgICAgICBzZXZlcmFsIE9wZW5HTCBzdGF0ZSBiaXRzLiBTaG91
bGQgYmUgcGFpcmVkIHdpdGgge0BsaW5rCiAgICAgICAgI2JlZ2luUmVuZGVyaW5nIGJlZ2luUmVu
ZGVyaW5nfS4KCiAgICAgICAgQHRocm93cyBHTEV4Y2VwdGlvbiBJZiBhbiBPcGVuR0wgY29udGV4
dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAogICAgKi8KICAgIHB1
YmxpYyB2b2lkIGVuZFJlbmRlcmluZygpIHRocm93cyBHTEV4Y2VwdGlvbiB7CiAgICAgICAgZW5k
UmVuZGVyaW5nKHRydWUpOwogICAgfQoKICAgIC8qKiBFbmRzIGEgM0QgcmVuZGVyIGN5Y2xlIHdp
dGggdGhpcyB7QGxpbmsgVGV4dFJlbmRlcmVyIFRleHRSZW5kZXJlcn0uCiAgICAgICAgUmVzdG9y
ZXMgc2V2ZXJhbCBPcGVuR0wgc3RhdGUgYml0cy4gU2hvdWxkIGJlIHBhaXJlZCB3aXRoIHtAbGlu
awogICAgICAgICNiZWdpbjNEUmVuZGVyaW5nIGJlZ2luM0RSZW5kZXJpbmd9LgoKICAgICAgICBA
dGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9wZW5HTCBjb250ZXh0IGlzIG5vdCBjdXJyZW50IHdo
ZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAgICAqLwogICAgcHVibGljIHZvaWQgZW5kM0RSZW5k
ZXJpbmcoKSB0aHJvd3MgR0xFeGNlcHRpb24gewogICAgICAgIGVuZFJlbmRlcmluZyhmYWxzZSk7
CiAgICB9CgogICAgLyoqIERpc3Bvc2VzIG9mIGFsbCByZXNvdXJjZXMgdGhpcyBUZXh0UmVuZGVy
ZXIgaXMgdXNpbmcuIEl0IGlzIG5vdAogICAgICAgIHZhbGlkIHRvIHVzZSB0aGUgVGV4dFJlbmRl
cmVyIGFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KCiAgICAgICAgQHRocm93cyBHTEV4Y2Vw
dGlvbiBJZiBhbiBPcGVuR0wgY29udGV4dCBpcyBub3QgY3VycmVudCB3aGVuIHRoaXMgbWV0aG9k
IGlzIGNhbGxlZAogICAgKi8KICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB0aHJvd3MgR0xFeGNl
cHRpb24gewogICAgCWlmKG1QaXBlbGluZWRRdWFkUmVuZGVyZXIgIT0gbnVsbCkgewogICAgCQlt
UGlwZWxpbmVkUXVhZFJlbmRlcmVyLmRpc3Bvc2UoKTsKICAgIAl9CiAgICAJcGFja2VyLmRpc3Bv
c2UoKTsKICAgICAgICBwYWNrZXIgPSBudWxsOwogICAgICAgIGNhY2hlZEJhY2tpbmdTdG9yZSA9
IG51bGw7CiAgICAgICAgY2FjaGVkR3JhcGhpY3MgPSBudWxsOwogICAgICAgIGNhY2hlZEZvbnRS
ZW5kZXJDb250ZXh0ID0gbnVsbDsKCiAgICAgICAgaWYgKGRiZ0ZyYW1lICE9IG51bGwpIHsKICAg
ICAgICAgICAgZGJnRnJhbWUuZGlzcG9zZSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvLy0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KICAgIC8vIEludGVybmFscyBvbmx5IGJlbG93IHRoaXMgcG9pbnQKICAgIC8vCgog
ICAgcHJpdmF0ZSBzdGF0aWMgUmVjdGFuZ2xlMkQgcHJlTm9ybWFsaXplKFJlY3RhbmdsZTJEIHNy
YykgewogICAgICAgIC8vIE5lZWQgdG8gcm91bmQgdG8gaW50ZWdlciBjb29yZGluYXRlcwogICAg
ICAgIC8vIEFsc28gZ2l2ZSBvdXJzZWx2ZXMgYSBsaXR0bGUgc2xvcCBhcm91bmQgdGhlIHJlcG9y
dGVkCiAgICAgICAgLy8gYm91bmRzIG9mIGdseXBocyBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgbmVp
dGhlciB0aGUgdmlzdWFsCiAgICAgICAgLy8gbm9yIHRoZSBwaXhlbCBib3VuZHMgd29ya3MgcGVy
ZmVjdGx5IHdlbGwKICAgICAgICBpbnQgbWluWCA9IChpbnQpIE1hdGguZmxvb3Ioc3JjLmdldE1p
blgoKSkgLSAxOwogICAgICAgIGludCBtaW5ZID0gKGludCkgTWF0aC5mbG9vcihzcmMuZ2V0TWlu
WSgpKSAtIDE7CiAgICAgICAgaW50IG1heFggPSAoaW50KSBNYXRoLmNlaWwoc3JjLmdldE1heFgo
KSkgKyAxOwogICAgICAgIGludCBtYXhZID0gKGludCkgTWF0aC5jZWlsKHNyYy5nZXRNYXhZKCkp
ICsgMTsKICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZTJELkRvdWJsZShtaW5YLCBtaW5ZLCBt
YXhYIC0gbWluWCwgbWF4WSAtIG1pblkpOwogICAgfQoKCiAgICBwcml2YXRlIFJlY3RhbmdsZTJE
IG5vcm1hbGl6ZShSZWN0YW5nbGUyRCBzcmMpIHsKICAgICAgICAvLyBHaXZlIG91cnNlbHZlcyBh
IGJvdW5kYXJ5IGFyb3VuZCBlYWNoIGVudGl0eSBvbiB0aGUgYmFja2luZwogICAgICAgIC8vIHN0
b3JlIGluIG9yZGVyIHRvIHByZXZlbnQgYmxlZWRpbmcgb2YgbmVhcmJ5IFN0cmluZ3MgZHVlIHRv
CiAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3ZSB1c2UgbGluZWFyIGZpbHRlcmluZwoKICAgICAg
ICAvLyBOT1RFIHRoYXQgdGhpcyBib3VuZGFyeSBpcyBxdWl0ZSBoZXVyaXN0aWMgYW5kIGlzIHJl
bGF0ZWQKICAgICAgICAvLyB0byBob3cgZmFyIGF3YXkgaW4gM0Qgd2UgbWF5IHZpZXcgdGhlIHRl
eHQgLS0KICAgICAgICAvLyBoZXVyaXN0aWNhbGx5LCAxLjUlIG9mIHRoZSBmb250J3MgaGVpZ2h0
CiAgICAgICAgaW50IGJvdW5kYXJ5ID0gKGludCkgTWF0aC5tYXgoMSwgMC4wMTUgKiBmb250Lmdl
dFNpemUoKSk7CgogICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlMkQuRG91YmxlKChpbnQpIE1h
dGguZmxvb3Ioc3JjLmdldE1pblgoKSAtIGJvdW5kYXJ5KSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmZsb29yKHNyYy5nZXRNaW5ZKCkgLSBib3VuZGFy
eSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWls
KHNyYy5nZXRXaWR0aCgpICsgMiAqIGJvdW5kYXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoaW50KSBNYXRoLmNlaWwoc3JjLmdldEhlaWdodCgpKSArIDIgKiBib3Vu
ZGFyeSk7CiAgICB9CgogICAgcHJpdmF0ZSBUZXh0dXJlUmVuZGVyZXIgZ2V0QmFja2luZ1N0b3Jl
KCkgewogICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IChUZXh0dXJlUmVuZGVyZXIp
IHBhY2tlci5nZXRCYWNraW5nU3RvcmUoKTsKCiAgICAgICAgaWYgKHJlbmRlcmVyICE9IGNhY2hl
ZEJhY2tpbmdTdG9yZSkgewogICAgICAgICAgICAvLyBCYWNraW5nIHN0b3JlIGNoYW5nZWQgc2lu
Y2UgbGFzdCB0aW1lOyBkaXNjYXJkIGFueSBjYWNoZWQgR3JhcGhpY3MyRAogICAgICAgICAgICBp
ZiAoY2FjaGVkR3JhcGhpY3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FjaGVkR3JhcGhp
Y3MuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3MgPSBudWxsOwogICAg
ICAgICAgICAgICAgY2FjaGVkRm9udFJlbmRlckNvbnRleHQgPSBudWxsOwogICAgICAgICAgICB9
CgogICAgICAgICAgICBjYWNoZWRCYWNraW5nU3RvcmUgPSByZW5kZXJlcjsKICAgICAgICB9Cgog
ICAgICAgIHJldHVybiBjYWNoZWRCYWNraW5nU3RvcmU7CiAgICB9CgogICAgcHJpdmF0ZSBHcmFw
aGljczJEIGdldEdyYXBoaWNzMkQoKSB7CiAgICAgICAgVGV4dHVyZVJlbmRlcmVyIHJlbmRlcmVy
ID0gZ2V0QmFja2luZ1N0b3JlKCk7CgogICAgICAgIGlmIChjYWNoZWRHcmFwaGljcyA9PSBudWxs
KSB7CiAgICAgICAgICAgIGNhY2hlZEdyYXBoaWNzID0gcmVuZGVyZXIuY3JlYXRlR3JhcGhpY3Mo
KTsKCiAgICAgICAgICAgIC8vIFNldCB1cCBjb21wb3NpdGUsIGZvbnQgYW5kIHJlbmRlcmluZyBo
aW50cwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3Np
dGUuU3JjKTsKICAgICAgICAgICAgY2FjaGVkR3JhcGhpY3Muc2V0Q29sb3IoQ29sb3IuV0hJVEUp
OwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5zZXRGb250KGZvbnQpOwogICAgICAgICAgICBj
YWNoZWRHcmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9URVhUX0FO
VElBTElBU0lORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
YW50aWFsaWFzZWQgPyBSZW5kZXJpbmdIaW50cy5WQUxVRV9URVhUX0FOVElBTElBU19PTgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJlbmRlcmluZ0hpbnRz
LlZBTFVFX1RFWFRfQU5USUFMSUFTX09GRikpOwogICAgICAgICAgICBjYWNoZWRHcmFwaGljcy5z
ZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9GUkFDVElPTkFMTUVUUklDUywKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlRnJhY3Rpb25hbE1l
dHJpY3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSZW5k
ZXJpbmdIaW50cy5WQUxVRV9GUkFDVElPTkFMTUVUUklDU19PTgogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJlbmRlcmluZ0hpbnRzLlZBTFVFX0ZSQUNUSU9O
QUxNRVRSSUNTX09GRikpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNhY2hlZEdyYXBoaWNz
OwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBiZWdpblJlbmRlcmluZyhib29sZWFuIG9ydGhvLCBp
bnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9v
bGVhbiBkaXNhYmxlRGVwdGhUZXN0Rm9yT3J0aG8pIHsKICAgICAgICBHTDIgZ2wgPSBHTENvbnRl
eHQuZ2V0Q3VycmVudEdMKCkuZ2V0R0wyKCk7CgogICAgICAgIGlmIChERUJVRyAmJiAhZGVidWdn
ZWQpIHsKICAgICAgICAgICAgZGVidWcoZ2wpOwogICAgICAgIH0KCiAgICAgICAgaW5CZWdpbkVu
ZFBhaXIgPSB0cnVlOwogICAgICAgIGlzT3J0aG9Nb2RlID0gb3J0aG87CiAgICAgICAgYmVnaW5S
ZW5kZXJpbmdXaWR0aCA9IHdpZHRoOwogICAgICAgIGJlZ2luUmVuZGVyaW5nSGVpZ2h0ID0gaGVp
Z2h0OwogICAgICAgIGJlZ2luUmVuZGVyaW5nRGVwdGhUZXN0RGlzYWJsZWQgPSBkaXNhYmxlRGVw
dGhUZXN0Rm9yT3J0aG87CgogICAgICAgIGlmIChvcnRobykgewogICAgICAgICAgICBnZXRCYWNr
aW5nU3RvcmUoKS5iZWdpbk9ydGhvUmVuZGVyaW5nKHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdEZv
ck9ydGhvKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5i
ZWdpbjNEUmVuZGVyaW5nKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBQdXNoIGNsaWVudCBhdHRy
aWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5kZXJlcgogICAgICAgIGdsLmds
UHVzaENsaWVudEF0dHJpYigoaW50KSBHTDIuR0xfQUxMX0NMSUVOVF9BVFRSSUJfQklUUyk7Cgog
ICAgICAgIGlmICghaGF2ZU1heFNpemUpIHsKICAgICAgICAgICAgLy8gUXVlcnkgT3BlbkdMIGZv
ciB0aGUgbWF4aW11bSB0ZXh0dXJlIHNpemUgYW5kIHNldCBpdCBpbiB0aGUKICAgICAgICAgICAg
Ly8gUmVjdGFuZ2xlUGFja2VyIHRvIGtlZXAgaXQgZnJvbSBleHBhbmRpbmcgdG9vIGxhcmdlCiAg
ICAgICAgICAgIGludFtdIHN6ID0gbmV3IGludFsxXTsKICAgICAgICAgICAgZ2wuZ2xHZXRJbnRl
Z2VydihHTDIuR0xfTUFYX1RFWFRVUkVfU0laRSwgc3osIDApOwogICAgICAgICAgICBwYWNrZXIu
c2V0TWF4U2l6ZShzelswXSwgc3pbMF0pOwogICAgICAgICAgICBoYXZlTWF4U2l6ZSA9IHRydWU7
CiAgICAgICAgfQoKICAgICAgICBpZiAobmVlZFRvUmVzZXRDb2xvciAmJiBoYXZlQ2FjaGVkQ29s
b3IpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZENvbG9yID09IG51bGwpIHsKICAgICAgICAgICAg
ICAgIGdldEJhY2tpbmdTdG9yZSgpLnNldENvbG9yKGNhY2hlZFIsIGNhY2hlZEcsIGNhY2hlZEIs
IGNhY2hlZEEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZ2V0QmFja2lu
Z1N0b3JlKCkuc2V0Q29sb3IoY2FjaGVkQ29sb3IpOwogICAgICAgICAgICB9CgogICAgICAgICAg
ICBuZWVkVG9SZXNldENvbG9yID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBEaXNhYmxl
IGZ1dHVyZSBhdHRlbXB0cyB0byB1c2UgbWlwbWFwcGluZyBpZiBUZXh0dXJlUmVuZGVyZXIKICAg
ICAgICAvLyBkb2Vzbid0IHN1cHBvcnQgaXQKICAgICAgICBpZiAobWlwbWFwICYmICFnZXRCYWNr
aW5nU3RvcmUoKS5pc1VzaW5nQXV0b01pcG1hcEdlbmVyYXRpb24oKSkgewogICAgICAgICAgICBp
ZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGlzYWJsZWQg
bWlwbWFwcGluZyBpbiBUZXh0UmVuZGVyZXIiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAg
bWlwbWFwID0gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogZW16aWM6IGhl
cmUgdGhlIGNhbGwgdG8gZ2xCaW5kQnVmZmVyIGNyYXNoZXMgb24gY2VydGFpbiBncmFwaGljc2Nh
cmQvZHJpdmVyIGNvbWJpbmF0aW9ucwogICAgICogdGhpcyBpcyB3aHkgdGhlIHVnbHkgdHJ5LWNh
dGNoIGJsb2NrIGhhcyBiZWVuIGFkZGVkLCB3aGljaCBmYWxscyBiYWNrIHRvIHRoZSBvbGQgdGV4
dHJlbmRlcmVyCiAgICAgKgogICAgICogQHBhcmFtIG9ydGhvCiAgICAgKiBAdGhyb3dzIEdMRXhj
ZXB0aW9uCiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBlbmRSZW5kZXJpbmcoYm9vbGVhbiBvcnRo
bykgdGhyb3dzIEdMRXhjZXB0aW9uIHsKICAgICAgICBmbHVzaEdseXBoUGlwZWxpbmUoKTsKCiAg
ICAgICAgaW5CZWdpbkVuZFBhaXIgPSBmYWxzZTsKCiAgICAgICAgR0wyIGdsID0gR0xDb250ZXh0
LmdldEN1cnJlbnRHTCgpLmdldEdMMigpOwoKICAgICAgICAvLyBQb3AgY2xpZW50IGF0dHJpYiBi
aXRzIHVzZWQgYnkgdGhlIHBpcGVsaW5lZCBxdWFkIHJlbmRlcmVyCiAgICAgICAgZ2wuZ2xQb3BD
bGllbnRBdHRyaWIoKTsKCiAgICAgICAgLy8gVGhlIE9wZW5HTCBzcGVjIGlzIHVuY2xlYXIgYWJv
dXQgd2hldGhlciB0aGlzIGNoYW5nZXMgdGhlCiAgICAgICAgLy8gYnVmZmVyIGJpbmRpbmdzLCBz
byBwcmVlbXB0aXZlbHkgemVybyBvdXQgdGhlIEdMX0FSUkFZX0JVRkZFUgogICAgICAgIC8vIGJp
bmRpbmcKICAgICAgICBpZiAoZ2V0VXNlVmVydGV4QXJyYXlzKCkgJiYgaXMxNUF2YWlsYWJsZShn
bCkpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGdsLmdsQmluZEJ1ZmZlcihH
TDIuR0xfQVJSQVlfQlVGRkVSLCAwKTsKICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUp
IHsKICAgICAgICAgICAgICAgIGlzRXh0ZW5zaW9uQXZhaWxhYmxlX0dMX1ZFUlNJT05fMV81ID0g
ZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvcnRobykgewogICAg
ICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5lbmRPcnRob1JlbmRlcmluZygpOwogICAgICAgIH0g
ZWxzZSB7CiAgICAgICAgICAgIGdldEJhY2tpbmdTdG9yZSgpLmVuZDNEUmVuZGVyaW5nKCk7CiAg
ICAgICAgfQoKICAgICAgICBpZiAoKytudW1SZW5kZXJDeWNsZXMgPj0gQ1lDTEVTX1BFUl9GTFVT
SCkgewogICAgICAgICAgICBudW1SZW5kZXJDeWNsZXMgPSAwOwoKICAgICAgICAgICAgaWYgKERF
QlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNsZWFyaW5nIHVudXNl
ZCBlbnRyaWVzIGluIGVuZFJlbmRlcmluZygpIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAg
IGNsZWFyVW51c2VkRW50cmllcygpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQg
Y2xlYXJVbnVzZWRFbnRyaWVzKCkgewogICAgICAgIGZpbmFsIGphdmEudXRpbC5MaXN0PFJlY3Q+
IGRlYWRSZWN0cyA9IG5ldyBBcnJheUxpc3Q8UmVjdD4oKTsKCiAgICAgICAgLy8gSXRlcmF0ZSB0
aHJvdWdoIHRoZSBjb250ZW50cyBvZiB0aGUgYmFja2luZyBzdG9yZSwgcmVtb3ZpbmcKICAgICAg
ICAvLyB0ZXh0IHN0cmluZ3MgdGhhdCBoYXZlbid0IGJlZW4gdXNlZCByZWNlbnRseQogICAgICAg
IHBhY2tlci52aXNpdChuZXcgUmVjdFZpc2l0b3IoKSB7CiAgICAgICAgICAgICAgICBAT3ZlcnJp
ZGUKICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFJlY3QgcmVjdCkgewogICAgICAg
ICAgICAgICAgICAgIFRleHREYXRhIGRhdGEgPSAoVGV4dERhdGEpIHJlY3QuZ2V0VXNlckRhdGEo
KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudXNlZCgpKSB7CiAgICAgICAgICAgICAg
ICAgICAgICAgIGRhdGEuY2xlYXJVc2VkKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsK
ICAgICAgICAgICAgICAgICAgICAgICAgZGVhZFJlY3RzLmFkZChyZWN0KTsKICAgICAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICBmb3Ig
KFJlY3QgciA6IGRlYWRSZWN0cykgewogICAgICAgICAgICBwYWNrZXIucmVtb3ZlKHIpOwogICAg
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
dCBzY2FsZUZhY3RvcikgewogICAgICAgIGZvciAoR2x5cGggZ2x5cGggOiBtR2x5cGhQcm9kdWNl
ci5nZXRHbHlwaHMoc3RyKSkgewogICAgICAgICAgICBmbG9hdCBhZHZhbmNlID0gZ2x5cGguZHJh
dzNEKHgsIHksIHosIHNjYWxlRmFjdG9yKTsKICAgICAgICAgICAgeCArPSBhZHZhbmNlICogc2Nh
bGVGYWN0b3I7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBmbHVzaEdseXBoUGlw
ZWxpbmUoKSB7CiAgICAgICAgaWYgKG1QaXBlbGluZWRRdWFkUmVuZGVyZXIgIT0gbnVsbCkgewog
ICAgICAgICAgICBtUGlwZWxpbmVkUXVhZFJlbmRlcmVyLmRyYXcoKTsKICAgICAgICB9CiAgICB9
CgogICAgcHJpdmF0ZSB2b2lkIGRyYXczRF9ST0JVU1QoQ2hhclNlcXVlbmNlIHN0ciwgZmxvYXQg
eCwgZmxvYXQgeSwgZmxvYXQgeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0
IHNjYWxlRmFjdG9yKSB7CiAgICAgICAgU3RyaW5nIGN1clN0cjsKICAgICAgICBpZiAoc3RyIGlu
c3RhbmNlb2YgU3RyaW5nKSB7CiAgICAgICAgICAgIGN1clN0ciA9IChTdHJpbmcpIHN0cjsKICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICBjdXJTdHIgPSBzdHIudG9TdHJpbmcoKTsKICAgICAg
ICB9CgogICAgICAgIC8vIExvb2sgdXAgdGhlIHN0cmluZyBvbiB0aGUgYmFja2luZyBzdG9yZQog
ICAgICAgIFJlY3QgcmVjdCA9IHN0cmluZ0xvY2F0aW9ucy5nZXQoY3VyU3RyKTsKCiAgICAgICAg
aWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBSYXN0ZXJpemUgdGhpcyBzdHJpbmcg
YW5kIHBsYWNlIGl0IG9uIHRoZSBiYWNraW5nIHN0b3JlCiAgICAgICAgICAgIEdyYXBoaWNzMkQg
ZyA9IGdldEdyYXBoaWNzMkQoKTsKICAgICAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ0JCb3ggPSBw
cmVOb3JtYWxpemUocmVuZGVyRGVsZWdhdGUuZ2V0Qm91bmRzKGN1clN0ciwgZm9udCwgZ2V0Rm9u
dFJlbmRlckNvbnRleHQoKSkpOwogICAgICAgICAgICBSZWN0YW5nbGUyRCBiYm94ID0gbm9ybWFs
aXplKG9yaWdCQm94KTsKICAgICAgICAgICAgUG9pbnQgb3JpZ2luID0gbmV3IFBvaW50KChpbnQp
IC1iYm94LmdldE1pblgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChp
bnQpIC1iYm94LmdldE1pblkoKSk7CiAgICAgICAgICAgIHJlY3QgPSBuZXcgUmVjdCgwLCAwLCAo
aW50KSBiYm94LmdldFdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBi
Ym94LmdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHREYXRh
KGN1clN0ciwgb3JpZ2luLCBvcmlnQkJveCwgLTEpKTsKCiAgICAgICAgICAgIHBhY2tlci5hZGQo
cmVjdCk7CiAgICAgICAgICAgIHN0cmluZ0xvY2F0aW9ucy5wdXQoY3VyU3RyLCByZWN0KTsKCiAg
ICAgICAgICAgIC8vIFJlLWZldGNoIHRoZSBHcmFwaGljczJEIGluIGNhc2UgdGhlIGFkZGl0aW9u
IG9mIHRoZSByZWN0YW5nbGUKICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSBvbGQgYmFja2luZyBz
dG9yZSB0byBiZSB0aHJvd24gYXdheQogICAgICAgICAgICBnID0gZ2V0R3JhcGhpY3MyRCgpOwoK
ICAgICAgICAgICAgLy8gT0ssIHNob3VsZCBub3cgaGF2ZSBhbiAoeCwgeSkgZm9yIHRoaXMgcmVj
dGFuZ2xlOyByYXN0ZXJpemUKICAgICAgICAgICAgLy8gdGhlIFN0cmluZwogICAgICAgICAgICBp
bnQgc3RyeCA9IHJlY3QueCgpICsgb3JpZ2luLng7CiAgICAgICAgICAgIGludCBzdHJ5ID0gcmVj
dC55KCkgKyBvcmlnaW4ueTsKCiAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgYXJlYSB3ZSdy
ZSBnb2luZyB0byBkcmF3IGludG8KICAgICAgICAgICAgZy5zZXRDb21wb3NpdGUoQWxwaGFDb21w
b3NpdGUuQ2xlYXIpOwogICAgICAgICAgICBnLmZpbGxSZWN0KHJlY3QueCgpLCByZWN0LnkoKSwg
cmVjdC53KCksIHJlY3QuaCgpKTsKICAgICAgICAgICAgZy5zZXRDb21wb3NpdGUoQWxwaGFDb21w
b3NpdGUuU3JjKTsKCiAgICAgICAgICAgIC8vIERyYXcgdGhlIHN0cmluZwogICAgICAgICAgICBy
ZW5kZXJEZWxlZ2F0ZS5kcmF3KGcsIGN1clN0ciwgc3RyeCwgc3RyeSk7CgogICAgICAgICAgICBp
ZiAoRFJBV19CQk9YRVMpIHsKICAgICAgICAgICAgICAgIFRleHREYXRhIGRhdGEgPSAoVGV4dERh
dGEpIHJlY3QuZ2V0VXNlckRhdGEoKTsKICAgICAgICAgICAgICAgIC8vIERyYXcgYSBib3VuZGlu
ZyBib3ggb24gdGhlIGJhY2tpbmcgc3RvcmUKICAgICAgICAgICAgICAgIGcuZHJhd1JlY3Qoc3Ry
eCAtIGRhdGEub3JpZ09yaWdpblgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyeSAt
IGRhdGEub3JpZ09yaWdpblkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgZGF0
YS5vcmlnUmVjdCgpLmdldFdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQp
IGRhdGEub3JpZ1JlY3QoKS5nZXRIZWlnaHQoKSk7CiAgICAgICAgICAgICAgICBnLmRyYXdSZWN0
KHN0cnggLSBkYXRhLm9yaWdpbigpLngsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnkg
LSBkYXRhLm9yaWdpbigpLnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudygpLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmgoKSk7CiAgICAgICAgICAgIH0KCiAgICAg
ICAgICAgIC8vIE1hcmsgdGhpcyByZWdpb24gb2YgdGhlIFRleHR1cmVSZW5kZXJlciBhcyBkaXJ0
eQogICAgICAgICAgICBnZXRCYWNraW5nU3RvcmUoKS5tYXJrRGlydHkocmVjdC54KCksIHJlY3Qu
eSgpLCByZWN0LncoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
Y3QuaCgpKTsKICAgICAgICB9CgogICAgICAgIC8vIE9LLCBub3cgZHJhdyB0aGUgcG9ydGlvbiBv
ZiB0aGUgYmFja2luZyBzdG9yZSB0byB0aGUgc2NyZWVuCiAgICAgICAgVGV4dHVyZVJlbmRlcmVy
IHJlbmRlcmVyID0gZ2V0QmFja2luZ1N0b3JlKCk7CgogICAgICAgIC8vIE5PVEUgdGhhdCB0aGUg
cmVjdGFuZ2xlcyBtYW5hZ2VkIGJ5IHRoZSBwYWNrZXIgaGF2ZSB0aGVpcgogICAgICAgIC8vIG9y
aWdpbiBhdCB0aGUgdXBwZXItbGVmdCBidXQgdGhlIFRleHR1cmVSZW5kZXJlcidzIG9yaWdpbiBp
cwogICAgICAgIC8vIGF0IGl0cyBsb3dlciBsZWZ0ISEhCiAgICAgICAgVGV4dERhdGEgZGF0YSA9
IChUZXh0RGF0YSkgcmVjdC5nZXRVc2VyRGF0YSgpOwogICAgICAgIGRhdGEubWFya1VzZWQoKTsK
CiAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QgPSBkYXRhLm9yaWdSZWN0KCk7CgogICAgICAg
IC8vIEFsaWduIHRoZSBsZWZ0bW9zdCBwb2ludCBvZiB0aGUgYmFzZWxpbmUgdG8gdGhlICh4LCB5
LCB6KSBjb29yZGluYXRlIHJlcXVlc3RlZAogICAgICAgIHJlbmRlcmVyLmRyYXczRFJlY3QoeCAt
IChzY2FsZUZhY3RvciAqIGRhdGEub3JpZ09yaWdpblgoKSksCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB5IC0gKHNjYWxlRmFjdG9yICogKChmbG9hdCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCkg
LSBkYXRhLm9yaWdPcmlnaW5ZKCkpKSwgeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
Y3QueCgpICsgKGRhdGEub3JpZ2luKCkueCAtIGRhdGEub3JpZ09yaWdpblgoKSksCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5nZXRIZWlnaHQoKSAtIHJlY3QueSgpIC0gKGlu
dCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCkgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
ZGF0YS5vcmlnaW4oKS55IC0gZGF0YS5vcmlnT3JpZ2luWSgpKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChpbnQpIG9yaWdSZWN0LmdldFdpZHRoKCksIChpbnQpIG9yaWdSZWN0LmdldEhl
aWdodCgpLCBzY2FsZUZhY3Rvcik7CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBE
ZWJ1Z2dpbmcgZnVuY3Rpb25hbGl0eQogICAgLy8KICAgIHByaXZhdGUgdm9pZCBkZWJ1ZyhHTCBn
bCkgewogICAgICAgIGRiZ0ZyYW1lID0gbmV3IEZyYW1lKCJUZXh0UmVuZGVyZXIgRGVidWcgT3V0
cHV0Iik7CgogICAgICAgIEdMQ2FudmFzIGRiZ0NhbnZhcyA9IG5ldyBHTENhbnZhcyhuZXcgR0xD
YXBhYmlsaXRpZXMoZ2wuZ2V0R0xQcm9maWxlKCkpKTsKICAgICAgICBkYmdDYW52YXMuc2V0U2hh
cmVkQ29udGV4dChHTENvbnRleHQuZ2V0Q3VycmVudCgpKTsKICAgICAgICBkYmdDYW52YXMuYWRk
R0xFdmVudExpc3RlbmVyKG5ldyBEZWJ1Z0xpc3RlbmVyKGdsLCBkYmdGcmFtZSkpOwogICAgICAg
IGRiZ0ZyYW1lLmFkZChkYmdDYW52YXMpOwoKICAgICAgICBmaW5hbCBGUFNBbmltYXRvciBhbmlt
ID0gbmV3IEZQU0FuaW1hdG9yKGRiZ0NhbnZhcywgMTApOwogICAgICAgIGRiZ0ZyYW1lLmFkZFdp
bmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkgewogICAgICAgICAgICAgICAgQE92ZXJy
aWRlCiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50
IGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBSdW4gdGhpcyBvbiBhbm90aGVyIHRocmVhZCB0
aGFuIHRoZSBBV1QgZXZlbnQgcXVldWUgdG8KICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1
cmUgdGhlIGNhbGwgdG8gQW5pbWF0b3Iuc3RvcCgpIGNvbXBsZXRlcyBiZWZvcmUKICAgICAgICAg
ICAgICAgICAgICAvLyBleGl0aW5nCiAgICAgICAgICAgICAgICAgICAgbmV3IFRocmVhZChuZXcg
UnVubmFibGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBhbmltLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAg
IH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkuc3RhcnQoKTsKICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgfSk7CiAgICAgICAgZGJnRnJhbWUuc2V0U2l6ZShrU2l6ZSwga1NpemUpOwog
ICAgICAgIGRiZ0ZyYW1lLnNldFZpc2libGUodHJ1ZSk7CiAgICAgICAgYW5pbS5zdGFydCgpOwog
ICAgICAgIGRlYnVnZ2VkID0gdHJ1ZTsKICAgIH0KCiAgICAvKiogQ2xhc3Mgc3VwcG9ydGluZyBt
b3JlIGZ1bGwgY29udHJvbCBvdmVyIHRoZSBwcm9jZXNzIG9mIHJlbmRlcmluZwogICAgICAgIHRo
ZSBiaXRtYXBwZWQgdGV4dC4gQWxsb3dzIGN1c3RvbWl6YXRpb24gb2Ygd2hldGhlciB0aGUgYmFj
a2luZwogICAgICAgIHN0b3JlIHRleHQgYml0bWFwIGlzIGZ1bGwtY29sb3Igb3IgaW50ZW5zaXR5
IG9ubHksIHRoZSBzaXplIG9mCiAgICAgICAgZWFjaCBpbmRpdmlkdWFsIHJlbmRlcmVkIHRleHQg
cmVjdGFuZ2xlLCBhbmQgdGhlIGNvbnRlbnRzIG9mCiAgICAgICAgZWFjaCBpbmRpdmlkdWFsIHJl
bmRlcmVkIHRleHQgc3RyaW5nLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgICAgIG9m
IHRoaXMgaW50ZXJmYWNlIHVzZXMgYW4gaW50ZW5zaXR5LW9ubHkgdGV4dHVyZSwgYQogICAgICAg
IGNsb3NlbHktY3JvcHBlZCByZWN0YW5nbGUgYXJvdW5kIHRoZSB0ZXh0LCBhbmQgcmVuZGVycyB0
ZXh0CiAgICAgICAgdXNpbmcgdGhlIGNvbG9yIHdoaXRlLCB3aGljaCBpcyBtb2R1bGF0ZWQgYnkg
dGhlIHNldCBjb2xvcgogICAgICAgIGR1cmluZyB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuICovCiAg
ICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBSZW5kZXJEZWxlZ2F0ZSB7CiAgICAgICAgLyoqIElu
ZGljYXRlcyB3aGV0aGVyIHRoZSBiYWNraW5nIHN0b3JlIG9mIHRoaXMgVGV4dFJlbmRlcmVyCiAg
ICAgICAgICAgIHNob3VsZCBiZSBpbnRlbnNpdHktb25seSAodGhlIGRlZmF1bHQpIG9yIGZ1bGwt
Y29sb3IuICovCiAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZW5zaXR5T25seSgpOwoKICAgICAg
ICAvKiogQ29tcHV0ZXMgdGhlIGJvdW5kcyBvZiB0aGUgZ2l2ZW4gU3RyaW5nIHJlbGF0aXZlIHRv
IHRoZQogICAgICAgICAgICBvcmlnaW4uICovCiAgICAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdl
dEJvdW5kcyhTdHJpbmcgc3RyLCBGb250IGZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMpOwoKICAgICAgICAvKiogQ29tcHV0ZXMg
dGhlIGJvdW5kcyBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHNlcXVlbmNlIHJlbGF0aXZlCiAgICAg
ICAgICAgIHRvIHRoZSBvcmlnaW4uICovCiAgICAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJv
dW5kcyhDaGFyU2VxdWVuY2Ugc3RyLCBGb250IGZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMpOwoKICAgICAgICAvKiogQ29tcHV0
ZXMgdGhlIGJvdW5kcyBvZiB0aGUgZ2l2ZW4gR2x5cGhWZWN0b3IsIGFscmVhZHkKICAgICAgICAg
ICAgYXNzdW1lZCB0byBoYXZlIGJlZW4gY3JlYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIEZvbnQsCiAg
ICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4uICovCiAgICAgICAgcHVibGljIFJlY3Rh
bmdsZTJEIGdldEJvdW5kcyhHbHlwaFZlY3RvciBndiwgRm9udFJlbmRlckNvbnRleHQgZnJjKTsK
CiAgICAgICAgLyoqIFJlbmRlciB0aGUgcGFzc2VkIGNoYXJhY3RlciBzZXF1ZW5jZSBhdCB0aGUg
ZGVzaWduYXRlZAogICAgICAgICAgICBsb2NhdGlvbiB1c2luZyB0aGUgc3VwcGxpZWQgR3JhcGhp
Y3MyRCBpbnN0YW5jZS4gVGhlCiAgICAgICAgICAgIHN1cnJvdW5kaW5nIHJlZ2lvbiB3aWxsIGFs
cmVhZHkgaGF2ZSBiZWVuIGNsZWFyZWQgdG8gdGhlIFJHQgogICAgICAgICAgICBjb2xvciAoMCwg
MCwgMCkgd2l0aCB6ZXJvIGFscGhhLiBUaGUgaW5pdGlhbCBkcmF3aW5nIGNvbnRleHQKICAgICAg
ICAgICAgb2YgdGhlIHBhc3NlZCBHcmFwaGljczJEIHdpbGwgYmUgc2V0IHRvIHVzZQogICAgICAg
ICAgICBBbHBoYUNvbXBvc2l0ZS5TcmMsIHRoZSBjb2xvciB3aGl0ZSwgdGhlIEZvbnQgc3BlY2lm
aWVkIGluIHRoZQogICAgICAgICAgICBUZXh0UmVuZGVyZXIncyBjb25zdHJ1Y3RvciwgYW5kIHRo
ZSByZW5kZXJpbmcgaGludHMgc3BlY2lmaWVkCiAgICAgICAgICAgIGluIHRoZSBUZXh0UmVuZGVy
ZXIgY29uc3RydWN0b3IuICBDaGFuZ2VzIG1hZGUgYnkgdGhlIGVuZCB1c2VyCiAgICAgICAgICAg
IG1heSBiZSB2aXNpYmxlIGluIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gdGhpcyBtZXRob2QsIGJ1dCBh
cmUgbm90CiAgICAgICAgICAgIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VydmVkLiAgSW1wbGVtZW50
b3JzIG9mIHRoaXMgbWV0aG9kCiAgICAgICAgICAgIHNob3VsZCByZXNldCB0aGUgR3JhcGhpY3My
RCdzIHN0YXRlIHRvIHRoYXQgZGVzaXJlZCBlYWNoIHRpbWUKICAgICAgICAgICAgdGhpcyBtZXRo
b2QgaXMgY2FsbGVkLCBpbiBwYXJ0aWN1bGFyIHRob3NlIHN0YXRlcyB3aGljaCBhcmUKICAgICAg
ICAgICAgbm90IHRoZSBkZWZhdWx0cy4gKi8KICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KEdyYXBo
aWNzMkQgZ3JhcGhpY3MsIFN0cmluZyBzdHIsIGludCB4LCBpbnQgeSk7CgogICAgICAgIC8qKiBS
ZW5kZXIgdGhlIHBhc3NlZCBHbHlwaFZlY3RvciBhdCB0aGUgZGVzaWduYXRlZCBsb2NhdGlvbiB1
c2luZwogICAgICAgICAgICB0aGUgc3VwcGxpZWQgR3JhcGhpY3MyRCBpbnN0YW5jZS4gVGhlIHN1
cnJvdW5kaW5nIHJlZ2lvbiB3aWxsCiAgICAgICAgICAgIGFscmVhZHkgaGF2ZSBiZWVuIGNsZWFy
ZWQgdG8gdGhlIFJHQiBjb2xvciAoMCwgMCwgMCkgd2l0aCB6ZXJvCiAgICAgICAgICAgIGFscGhh
LiBUaGUgaW5pdGlhbCBkcmF3aW5nIGNvbnRleHQgb2YgdGhlIHBhc3NlZCBHcmFwaGljczJECiAg
ICAgICAgICAgIHdpbGwgYmUgc2V0IHRvIHVzZSBBbHBoYUNvbXBvc2l0ZS5TcmMsIHRoZSBjb2xv
ciB3aGl0ZSwgdGhlCiAgICAgICAgICAgIEZvbnQgc3BlY2lmaWVkIGluIHRoZSBUZXh0UmVuZGVy
ZXIncyBjb25zdHJ1Y3RvciwgYW5kIHRoZQogICAgICAgICAgICByZW5kZXJpbmcgaGludHMgc3Bl
Y2lmaWVkIGluIHRoZSBUZXh0UmVuZGVyZXIgY29uc3RydWN0b3IuCiAgICAgICAgICAgIENoYW5n
ZXMgbWFkZSBieSB0aGUgZW5kIHVzZXIgbWF5IGJlIHZpc2libGUgaW4gc3VjY2Vzc2l2ZQogICAg
ICAgICAgICBjYWxscyB0byB0aGlzIG1ldGhvZCwgYnV0IGFyZSBub3QgZ3VhcmFudGVlZCB0byBi
ZSBwcmVzZXJ2ZWQuCiAgICAgICAgICAgIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCBzaG91
bGQgcmVzZXQgdGhlIEdyYXBoaWNzMkQncwogICAgICAgICAgICBzdGF0ZSB0byB0aGF0IGRlc2ly
ZWQgZWFjaCB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgaW4KICAgICAgICAgICAgcGFydGlj
dWxhciB0aG9zZSBzdGF0ZXMgd2hpY2ggYXJlIG5vdCB0aGUgZGVmYXVsdHMuICovCiAgICAgICAg
cHVibGljIHZvaWQgZHJhd0dseXBoVmVjdG9yKEdyYXBoaWNzMkQgZ3JhcGhpY3MsIEdseXBoVmVj
dG9yIHN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5
KTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFyU2VxdWVuY2VJdGVyYXRvciBp
bXBsZW1lbnRzIENoYXJhY3Rlckl0ZXJhdG9yIHsKICAgICAgICBDaGFyU2VxdWVuY2UgbVNlcXVl
bmNlOwogICAgICAgIGludCBtTGVuZ3RoOwogICAgICAgIGludCBtQ3VycmVudEluZGV4OwoKICAg
ICAgICBDaGFyU2VxdWVuY2VJdGVyYXRvcigpIHsKICAgICAgICB9CgogICAgICAgIENoYXJTZXF1
ZW5jZUl0ZXJhdG9yKENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSkgewogICAgICAgICAgICBpbml0RnJv
bUNoYXJTZXF1ZW5jZShzZXF1ZW5jZSk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBp
bml0RnJvbUNoYXJTZXF1ZW5jZShDaGFyU2VxdWVuY2Ugc2VxdWVuY2UpIHsKICAgICAgICAgICAg
bVNlcXVlbmNlID0gc2VxdWVuY2U7CiAgICAgICAgICAgIG1MZW5ndGggPSBtU2VxdWVuY2UubGVu
Z3RoKCk7CiAgICAgICAgICAgIG1DdXJyZW50SW5kZXggPSAwOwogICAgICAgIH0KCiAgICAgICAg
QE92ZXJyaWRlCiAgICAgICAgcHVibGljIGNoYXIgbGFzdCgpIHsKICAgICAgICAgICAgbUN1cnJl
bnRJbmRleCA9IE1hdGgubWF4KDAsIG1MZW5ndGggLSAxKTsKCiAgICAgICAgICAgIHJldHVybiBj
dXJyZW50KCk7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgY2hh
ciBjdXJyZW50KCkgewogICAgICAgICAgICBpZiAoKG1MZW5ndGggPT0gMCkgfHwgKG1DdXJyZW50
SW5kZXggPj0gbUxlbmd0aCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBDaGFyYWN0ZXJJdGVy
YXRvci5ET05FOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbVNlcXVlbmNlLmNo
YXJBdChtQ3VycmVudEluZGV4KTsKICAgICAgICB9CgogICAgICAgIEBPdmVycmlkZQogICAgICAg
IHB1YmxpYyBjaGFyIG5leHQoKSB7CiAgICAgICAgICAgIG1DdXJyZW50SW5kZXgrKzsKCiAgICAg
ICAgICAgIHJldHVybiBjdXJyZW50KCk7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAg
ICAgICBwdWJsaWMgY2hhciBwcmV2aW91cygpIHsKICAgICAgICAgICAgbUN1cnJlbnRJbmRleCA9
IE1hdGgubWF4KG1DdXJyZW50SW5kZXggLSAxLCAwKTsKCiAgICAgICAgICAgIHJldHVybiBjdXJy
ZW50KCk7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgY2hhciBz
ZXRJbmRleChpbnQgcG9zaXRpb24pIHsKICAgICAgICAgICAgbUN1cnJlbnRJbmRleCA9IHBvc2l0
aW9uOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQoKTsKICAgICAgICB9CgogICAgICAgIEBP
dmVycmlkZQogICAgICAgIHB1YmxpYyBpbnQgZ2V0QmVnaW5JbmRleCgpIHsKICAgICAgICAgICAg
cmV0dXJuIDA7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgaW50
IGdldEVuZEluZGV4KCkgewogICAgICAgICAgICByZXR1cm4gbUxlbmd0aDsKICAgICAgICB9Cgog
ICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CiAgICAgICAg
ICAgIHJldHVybiBtQ3VycmVudEluZGV4OwogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAg
ICAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgICAgQ2hhclNlcXVlbmNlSXRl
cmF0b3IgaXRlciA9IG5ldyBDaGFyU2VxdWVuY2VJdGVyYXRvcihtU2VxdWVuY2UpOwogICAgICAg
ICAgICBpdGVyLm1DdXJyZW50SW5kZXggPSBtQ3VycmVudEluZGV4OwoKICAgICAgICAgICAgcmV0
dXJuIGl0ZXI7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgY2hh
ciBmaXJzdCgpIHsKICAgICAgICAgICAgaWYgKG1MZW5ndGggPT0gMCkgewogICAgICAgICAgICAg
ICAgcmV0dXJuIENoYXJhY3Rlckl0ZXJhdG9yLkRPTkU7CiAgICAgICAgICAgIH0KCiAgICAgICAg
ICAgIG1DdXJyZW50SW5kZXggPSAwOwoKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQoKTsKICAg
ICAgICB9CiAgICB9CgogICAgLy8gRGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCByZWN0YW5nbGUg
b2YgdGV4dAogICAgc3RhdGljIGNsYXNzIFRleHREYXRhIHsKICAgICAgICAvLyBCYWNrLXBvaW50
ZXIgdG8gU3RyaW5nIHRoaXMgVGV4dERhdGEgZGVzY3JpYmVzLCBpZiBpdAogICAgICAgIC8vIHJl
cHJlc2VudHMgYSBTdHJpbmcgcmF0aGVyIHRoYW4gYSBzaW5nbGUgZ2x5cGgKICAgICAgICBwcml2
YXRlIGZpbmFsIFN0cmluZyBzdHI7CgogICAgICAgIC8vIElmIHRoaXMgVGV4dERhdGEgcmVwcmVz
ZW50cyBhIHNpbmdsZSBnbHlwaCwgdGhpcyBpcyBpdHMKICAgICAgICAvLyB1bmljb2RlIElECiAg
ICAgICAgaW50IHVuaWNvZGVJRDsKCiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBtdXN0IGJlIGRl
ZmluZWQgYW5kIHVzZWQgVkVSWSBwcmVjaXNlbHkuIFRoaXMgaXMKICAgICAgICAvLyB0aGUgb2Zm
c2V0IGZyb20gdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoaXMgcmVjdGFuZ2xlIChKYXZhCiAg
ICAgICAgLy8gMkQgY29vcmRpbmF0ZSBzeXN0ZW0pIGF0IHdoaWNoIHRoZSBzdHJpbmcgbXVzdCBi
ZSByYXN0ZXJpemVkIGluCiAgICAgICAgLy8gb3JkZXIgdG8gZml0IHdpdGhpbiB0aGUgcmVjdGFu
Z2xlIC0tIHRoZSBsZWZ0bW9zdCBwb2ludCBvZiB0aGUKICAgICAgICAvLyBiYXNlbGluZS4KICAg
ICAgICBwcml2YXRlIGZpbmFsIFBvaW50IG9yaWdpbjsKCiAgICAgICAgLy8gVGhpcyByZXByZXNl
bnRzIHRoZSBwcmUtbm9ybWFsaXplZCByZWN0YW5nbGUsIHdoaWNoIGZpdHMKICAgICAgICAvLyB3
aXRoaW4gdGhlIHJlY3RhbmdsZSBvbiB0aGUgYmFja2luZyBzdG9yZS4gV2Uga2VlcCBhCiAgICAg
ICAgLy8gb25lLXBpeGVsIGJvcmRlciBhcm91bmQgZW50cmllcyBvbiB0aGUgYmFja2luZyBzdG9y
ZSB0bwogICAgICAgIC8vIHByZXZlbnQgYmxlZWRpbmcgb2YgYWRqYWNlbnQgbGV0dGVycyB3aGVu
IHVzaW5nIEdMX0xJTkVBUgogICAgICAgIC8vIGZpbHRlcmluZyBmb3IgcmVuZGVyaW5nLiBUaGUg
b3JpZ2luIG9mIHRoaXMgcmVjdGFuZ2xlIGlzCiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGUg
b3JpZ2luIGFib3ZlLgogICAgICAgIHByaXZhdGUgZmluYWwgUmVjdGFuZ2xlMkQgb3JpZ1JlY3Q7
CgogICAgICAgIHByaXZhdGUgYm9vbGVhbiB1c2VkOyAvLyBXaGV0aGVyIHRoaXMgdGV4dCB3YXMg
dXNlZCByZWNlbnRseQoKICAgICAgICBUZXh0RGF0YShTdHJpbmcgc3RyLCBQb2ludCBvcmlnaW4s
IFJlY3RhbmdsZTJEIG9yaWdSZWN0LCBpbnQgdW5pY29kZUlEKSB7CiAgICAgICAgICAgIHRoaXMu
c3RyID0gc3RyOwogICAgICAgICAgICB0aGlzLm9yaWdpbiA9IG9yaWdpbjsKICAgICAgICAgICAg
dGhpcy5vcmlnUmVjdCA9IG9yaWdSZWN0OwogICAgICAgICAgICB0aGlzLnVuaWNvZGVJRCA9IHVu
aWNvZGVJRDsKICAgICAgICB9CgogICAgICAgIFN0cmluZyBzdHJpbmcoKSB7CiAgICAgICAgICAg
IHJldHVybiBzdHI7CiAgICAgICAgfQoKICAgICAgICBQb2ludCBvcmlnaW4oKSB7CiAgICAgICAg
ICAgIHJldHVybiBvcmlnaW47CiAgICAgICAgfQoKICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHRo
cmVlIG1ldGhvZHMgYXJlIHVzZWQgdG8gbG9jYXRlIHRoZSBnbHlwaAogICAgICAgIC8vIHdpdGhp
biB0aGUgZXhwYW5kZWQgcmVjdGFuZ2xlIGNvbWluZyBmcm9tIG5vcm1hbGl6ZSgpCiAgICAgICAg
aW50IG9yaWdPcmlnaW5YKCkgewogICAgICAgICAgICByZXR1cm4gKGludCkgLW9yaWdSZWN0Lmdl
dE1pblgoKTsKICAgICAgICB9CgogICAgICAgIGludCBvcmlnT3JpZ2luWSgpIHsKICAgICAgICAg
ICAgcmV0dXJuIChpbnQpIC1vcmlnUmVjdC5nZXRNaW5ZKCk7CiAgICAgICAgfQoKICAgICAgICBS
ZWN0YW5nbGUyRCBvcmlnUmVjdCgpIHsKICAgICAgICAgICAgcmV0dXJuIG9yaWdSZWN0OwogICAg
ICAgIH0KCiAgICAgICAgYm9vbGVhbiB1c2VkKCkgewogICAgICAgICAgICByZXR1cm4gdXNlZDsK
ICAgICAgICB9CgogICAgICAgIHZvaWQgbWFya1VzZWQoKSB7CiAgICAgICAgICAgIHVzZWQgPSB0
cnVlOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBjbGVhclVzZWQoKSB7CiAgICAgICAgICAgIHVz
ZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgTWFuYWdlciBpbXBsZW1lbnRz
IEJhY2tpbmdTdG9yZU1hbmFnZXIgewogICAgICAgIHByaXZhdGUgR3JhcGhpY3MyRCBnOwoKICAg
ICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgT2JqZWN0IGFsbG9jYXRlQmFja2luZ1N0b3Jl
KGludCB3LCBpbnQgaCkgewogICAgICAgICAgICAvLyBGSVhNRTogc2hvdWxkIGNvbnNpZGVyIGNo
ZWNraW5nIEZvbnQncyBhdHRyaWJ1dGVzIHRvIHNlZQogICAgICAgICAgICAvLyB3aGV0aGVyIHdl
J3JlIGxpa2VseSB0byBuZWVkIHRvIHN1cHBvcnQgYSBmdWxsIFJHQkEgYmFja2luZwogICAgICAg
ICAgICAvLyBzdG9yZSAoaS5lLiwgbm9uLWRlZmF1bHQgUGFpbnQsIGZvcmVncm91bmQgY29sb3Is
IGV0Yy4pLCBidXQKICAgICAgICAgICAgLy8gZm9yIG5vdywgbGV0J3MganVzdCBiZSBtb3JlIGVm
ZmljaWVudAogICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXI7CgogICAgICAgICAg
ICBpZiAocmVuZGVyRGVsZWdhdGUuaW50ZW5zaXR5T25seSgpKSB7CiAgICAgICAgICAgICAgICBy
ZW5kZXJlciA9IFRleHR1cmVSZW5kZXJlci5jcmVhdGVBbHBoYU9ubHlSZW5kZXJlcih3LCBoLCBt
aXBtYXApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVuZGVyZXIgPSBu
ZXcgVGV4dHVyZVJlbmRlcmVyKHcsIGgsIHRydWUsIG1pcG1hcCk7CiAgICAgICAgICAgIH0KICAg
ICAgICAgICAgcmVuZGVyZXIuc2V0U21vb3RoaW5nKHNtb290aGluZyk7CgogICAgICAgICAgICBp
ZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIFRleHRSZW5k
ZXJlciBhbGxvY2F0aW5nIGJhY2tpbmcgc3RvcmUgIiArCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdyArICIgeCAiICsgaCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJl
dHVybiByZW5kZXJlcjsKICAgICAgICB9CgogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1Ymxp
YyB2b2lkIGRlbGV0ZUJhY2tpbmdTdG9yZShPYmplY3QgYmFja2luZ1N0b3JlKSB7CiAgICAgICAg
ICAgICgoVGV4dHVyZVJlbmRlcmVyKSBiYWNraW5nU3RvcmUpLmRpc3Bvc2UoKTsKICAgICAgICB9
CgogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyBib29sZWFuIHByZUV4cGFuZChSZWN0
IGNhdXNlLCBpbnQgYXR0ZW1wdE51bWJlcikgewogICAgICAgICAgICAvLyBPbmx5IHRyeSB0aGlz
IG9uZSB0aW1lOyBjbGVhciBvdXQgcG90ZW50aWFsbHkgb2Jzb2xldGUgZW50cmllcwogICAgICAg
ICAgICAvLyBOT1RFOiB0aGlzIGhldXJpc3RpYyBhbmQgdGhlIGZhY3QgdGhhdCBpdCBjbGVhcnMg
dGhlIHVzZWQgYml0CiAgICAgICAgICAgIC8vIG9mIGFsbCBlbnRyaWVzIHNlZW1zIHRvIGNhdXNl
IGN5Y2xpbmcgb2YgZW50cmllcyBpbiBzb21lCiAgICAgICAgICAgIC8vIHNpdHVhdGlvbnMsIHdo
ZXJlIHRoZSBiYWNraW5nIHN0b3JlIGJlY29tZXMgc21hbGwgY29tcGFyZWQgdG8KICAgICAgICAg
ICAgLy8gdGhlIGFtb3VudCBvZiB0ZXh0IG9uIHRoZSBzY3JlZW4gKHNlZSB0aGUgVGV4dEZsb3cg
ZGVtbykgYW5kCiAgICAgICAgICAgIC8vIHRoZSBlbnRyaWVzIGNvbnRpbnVhbGx5IGN5Y2xlIGlu
IGFuZCBvdXQgb2YgdGhlIGJhY2tpbmcKICAgICAgICAgICAgLy8gc3RvcmUsIGRlY3JlYXNpbmcg
cGVyZm9ybWFuY2UuIElmIHdlIGFkZGVkIGEgbGl0dGxlIGFnZQogICAgICAgICAgICAvLyBpbmZv
cm1hdGlvbiB0byB0aGUgZW50cmllcywgYW5kIG9ubHkgY2xlYXJlZCBvdXQgZW50cmllcwogICAg
ICAgICAgICAvLyBhYm92ZSBhIGNlcnRhaW4gYWdlLCB0aGlzIGJlaGF2aW9yIHdvdWxkIGJlIGVs
aW1pbmF0ZWQuCiAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGl0IHNlZW1zIHRoZSBzeXN0ZW0gdXN1
YWxseSBzdGFiaWxpemVzIGl0c2VsZiwgc28KICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSdsbCBq
dXN0IGtlZXAgdGhpbmdzIHNpbXBsZS4gTm90ZSB0aGF0IGlmIHdlIGRvbid0CiAgICAgICAgICAg
IC8vIGNsZWFyIHRoZSB1c2VkIGJpdCBoZXJlLCB0aGUgYmFja2luZyBzdG9yZSB0ZW5kcyB0byBp
bmNyZWFzZQogICAgICAgICAgICAvLyB2ZXJ5IHF1aWNrbHkgdG8gaXRzIG1heGltdW0gc2l6ZSwg
YXQgbGVhc3Qgd2l0aCB0aGUgVGV4dEZsb3cKICAgICAgICAgICAgLy8gZGVtbyB3aGVuIHRoZSB0
ZXh0IGlzIGJlaW5nIGNvbnRpbnVhbGx5IHJlLWxhaWQgb3V0LgogICAgICAgICAgICBpZiAoYXR0
ZW1wdE51bWJlciA9PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAg
ICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCiAgICAgICAgICAgICAgICAgICAgICAgICJD
bGVhcmluZyB1bnVzZWQgZW50cmllcyBpbiBwcmVFeHBhbmQoKTogYXR0ZW1wdCBudW1iZXIgIiAr
CiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHROdW1iZXIpOwogICAgICAgICAgICAgICAg
fQoKICAgICAgICAgICAgICAgIGlmIChpbkJlZ2luRW5kUGFpcikgewogICAgICAgICAgICAgICAg
ICAgIC8vIERyYXcgYW55IG91dHN0YW5kaW5nIGdseXBocwogICAgICAgICAgICAgICAgICAgIGZs
dXNoKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xlYXJVbnVzZWRFbnRy
aWVzKCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIEBPdmVycmlkZQogICAgICAg
IHB1YmxpYyBib29sZWFuIGFkZGl0aW9uRmFpbGVkKFJlY3QgY2F1c2UsIGludCBhdHRlbXB0TnVt
YmVyKSB7CiAgICAgICAgICAgIC8vIEhlYXZ5IGhhbW1lciAtLSBtaWdodCBjb25zaWRlciBkb2lu
ZyBzb21ldGhpbmcgZGlmZmVyZW50CiAgICAgICAgICAgIHBhY2tlci5jbGVhcigpOwogICAgICAg
ICAgICBzdHJpbmdMb2NhdGlvbnMuY2xlYXIoKTsKICAgICAgICAgICAgbUdseXBoUHJvZHVjZXIu
Y2xlYXJBbGxDYWNoZUVudHJpZXMoKTsKCiAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAg
ICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICIgKioqIENsZWFyZWQgYWxsIHRleHQgYmVjYXVzZSBhZGRpdGlvbiBmYWlsZWQgKioq
Iik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChhdHRlbXB0TnVtYmVyID09IDApIHsK
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMg
Ym9vbGVhbiBjYW5Db21wYWN0KCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9
CgogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyB2b2lkIGJlZ2luTW92ZW1lbnQoT2Jq
ZWN0IG9sZEJhY2tpbmdTdG9yZSwgT2JqZWN0IG5ld0JhY2tpbmdTdG9yZSkgewogICAgICAgICAg
ICAvLyBFeGl0IHRoZSBiZWdpbiAvIGVuZCBwYWlyIGlmIG5lY2Vzc2FyeQogICAgICAgICAgICBp
ZiAoaW5CZWdpbkVuZFBhaXIpIHsKICAgICAgICAgICAgICAgIC8vIERyYXcgYW55IG91dHN0YW5k
aW5nIGdseXBocwogICAgICAgICAgICAgICAgZmx1c2goKTsKCiAgICAgICAgICAgICAgICBHTDIg
Z2wgPSBHTENvbnRleHQuZ2V0Q3VycmVudEdMKCkuZ2V0R0wyKCk7CgogICAgICAgICAgICAgICAg
Ly8gUG9wIGNsaWVudCBhdHRyaWIgYml0cyB1c2VkIGJ5IHRoZSBwaXBlbGluZWQgcXVhZCByZW5k
ZXJlcgogICAgICAgICAgICAgICAgZ2wuZ2xQb3BDbGllbnRBdHRyaWIoKTsKCiAgICAgICAgICAg
ICAgICAvLyBUaGUgT3BlbkdMIHNwZWMgaXMgdW5jbGVhciBhYm91dCB3aGV0aGVyIHRoaXMgY2hh
bmdlcyB0aGUKICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBiaW5kaW5ncywgc28gcHJlZW1wdGl2
ZWx5IHplcm8gb3V0IHRoZSBHTF9BUlJBWV9CVUZGRVIKICAgICAgICAgICAgICAgIC8vIGJpbmRp
bmcKICAgICAgICAgICAgICAgIGlmIChnZXRVc2VWZXJ0ZXhBcnJheXMoKSAmJiBpczE1QXZhaWxh
YmxlKGdsKSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAg
ICAgIGdsLmdsQmluZEJ1ZmZlcihHTDIuR0xfQVJSQVlfQlVGRkVSLCAwKTsKICAgICAgICAgICAg
ICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICBp
c0V4dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJTSU9OXzFfNSA9IGZhbHNlOwogICAgICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXNPcnRob01v
ZGUpIHsKICAgICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgb2xkQmFja2luZ1N0
b3JlKS5lbmRPcnRob1JlbmRlcmluZygpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgb2xkQmFja2luZ1N0b3JlKS5lbmQzRFJl
bmRlcmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBU
ZXh0dXJlUmVuZGVyZXIgbmV3UmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBuZXdCYWNraW5n
U3RvcmU7CiAgICAgICAgICAgIGcgPSBuZXdSZW5kZXJlci5jcmVhdGVHcmFwaGljcygpOwogICAg
ICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIHZvaWQgbW92ZShPYmplY3Qg
b2xkQmFja2luZ1N0b3JlLCBSZWN0IG9sZExvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAg
ICAgT2JqZWN0IG5ld0JhY2tpbmdTdG9yZSwgUmVjdCBuZXdMb2NhdGlvbikgewogICAgICAgICAg
ICBUZXh0dXJlUmVuZGVyZXIgb2xkUmVuZGVyZXIgPSAoVGV4dHVyZVJlbmRlcmVyKSBvbGRCYWNr
aW5nU3RvcmU7CiAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciBuZXdSZW5kZXJlciA9IChUZXh0
dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZTsKCiAgICAgICAgICAgIGlmIChvbGRSZW5kZXJl
ciA9PSBuZXdSZW5kZXJlcikgewogICAgICAgICAgICAgICAgLy8gTW92ZW1lbnQgb24gdGhlIHNh
bWUgYmFja2luZyBzdG9yZSAtLSBlYXN5IGNhc2UKICAgICAgICAgICAgICAgIGcuY29weUFyZWEo
b2xkTG9jYXRpb24ueCgpLCBvbGRMb2NhdGlvbi55KCksIG9sZExvY2F0aW9uLncoKSwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgb2xkTG9jYXRpb24uaCgpLCBuZXdMb2NhdGlvbi54KCkgLSBv
bGRMb2NhdGlvbi54KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xvY2F0aW9uLnko
KSAtIG9sZExvY2F0aW9uLnkoKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAg
ICAvLyBOZWVkIHRvIGRyYXcgZnJvbSB0aGUgb2xkIHJlbmRlcmVyJ3MgaW1hZ2UgaW50byB0aGUg
bmV3IG9uZQogICAgICAgICAgICAgICAgSW1hZ2UgaW1nID0gb2xkUmVuZGVyZXIuZ2V0SW1hZ2Uo
KTsKICAgICAgICAgICAgICAgIGcuZHJhd0ltYWdlKGltZywgbmV3TG9jYXRpb24ueCgpLCBuZXdM
b2NhdGlvbi55KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMb2NhdGlvbi54KCkg
KyBuZXdMb2NhdGlvbi53KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMb2NhdGlv
bi55KCkgKyBuZXdMb2NhdGlvbi5oKCksIG9sZExvY2F0aW9uLngoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG9sZExvY2F0aW9uLnkoKSwgb2xkTG9jYXRpb24ueCgpICsgb2xkTG9jYXRp
b24udygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9jYXRpb24ueSgpICsgb2xk
TG9jYXRpb24uaCgpLCBudWxsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQE92
ZXJyaWRlCiAgICAgICAgcHVibGljIHZvaWQgZW5kTW92ZW1lbnQoT2JqZWN0IG9sZEJhY2tpbmdT
dG9yZSwgT2JqZWN0IG5ld0JhY2tpbmdTdG9yZSkgewogICAgICAgICAgICBnLmRpc3Bvc2UoKTsK
CiAgICAgICAgICAgIC8vIFN5bmMgdGhlIHdob2xlIHN1cmZhY2UKICAgICAgICAgICAgVGV4dHVy
ZVJlbmRlcmVyIG5ld1JlbmRlcmVyID0gKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3Jl
OwogICAgICAgICAgICBuZXdSZW5kZXJlci5tYXJrRGlydHkoMCwgMCwgbmV3UmVuZGVyZXIuZ2V0
V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JlbmRlcmVyLmdl
dEhlaWdodCgpKTsKCiAgICAgICAgICAgIC8vIFJlLWVudGVyIHRoZSBiZWdpbiAvIGVuZCBwYWly
IGlmIG5lY2Vzc2FyeQogICAgICAgICAgICBpZiAoaW5CZWdpbkVuZFBhaXIpIHsKICAgICAgICAg
ICAgICAgIGlmIChpc09ydGhvTW9kZSkgewogICAgICAgICAgICAgICAgICAgICgoVGV4dHVyZVJl
bmRlcmVyKSBuZXdCYWNraW5nU3RvcmUpLmJlZ2luT3J0aG9SZW5kZXJpbmcoYmVnaW5SZW5kZXJp
bmdXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luUmVuZGVyaW5nSGVpZ2h0LCBiZWdpblJl
bmRlcmluZ0RlcHRoVGVzdERpc2FibGVkKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAg
ICAgICAgICAgICAgICAgKChUZXh0dXJlUmVuZGVyZXIpIG5ld0JhY2tpbmdTdG9yZSkuYmVnaW4z
RFJlbmRlcmluZygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFB1c2gg
Y2xpZW50IGF0dHJpYiBiaXRzIHVzZWQgYnkgdGhlIHBpcGVsaW5lZCBxdWFkIHJlbmRlcmVyCiAg
ICAgICAgICAgICAgICBHTDIgZ2wgPSBHTENvbnRleHQuZ2V0Q3VycmVudEdMKCkuZ2V0R0wyKCk7
CiAgICAgICAgICAgICAgICBnbC5nbFB1c2hDbGllbnRBdHRyaWIoKGludCkgR0wyLkdMX0FMTF9D
TElFTlRfQVRUUklCX0JJVFMpOwoKICAgICAgICAgICAgICAgIGlmIChoYXZlQ2FjaGVkQ29sb3Ip
IHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkQ29sb3IgPT0gbnVsbCkgewogICAgICAg
ICAgICAgICAgICAgICAgICAoKFRleHR1cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5zZXRD
b2xvcihjYWNoZWRSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRHLCBjYWNoZWRCLCBjYWNoZWRBKTsKICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoKFRleHR1
cmVSZW5kZXJlcikgbmV3QmFja2luZ1N0b3JlKS5zZXRDb2xvcihjYWNoZWRDb2xvcik7CiAgICAg
ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2Ugewog
ICAgICAgICAgICAgICAgbmVlZFRvUmVzZXRDb2xvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAg
ICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0UmVuZGVyRGVsZWdh
dGUgaW1wbGVtZW50cyBSZW5kZXJEZWxlZ2F0ZSB7CiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAg
cHVibGljIGJvb2xlYW4gaW50ZW5zaXR5T25seSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7
CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQg
Z2V0Qm91bmRzKENoYXJTZXF1ZW5jZSBzdHIsIEZvbnQgZm9udCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICAgICBy
ZXR1cm4gZ2V0Qm91bmRzKGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJTZXF1ZW5jZUl0
ZXJhdG9yKHN0cikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYyk7CiAgICAgICAg
fQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRz
KFN0cmluZyBzdHIsIEZvbnQgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICAgICByZXR1cm4gZ2V0Qm91bmRz
KGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLCBzdHIpLCBmcmMpOwogICAgICAgIH0KCiAgICAg
ICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kcyhHbHlwaFZl
Y3RvciBndiwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAgICAgICAgICAgIHJldHVybiBndi5n
ZXRWaXN1YWxCb3VuZHMoKTsKICAgICAgICB9CgogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1
YmxpYyB2b2lkIGRyYXdHbHlwaFZlY3RvcihHcmFwaGljczJEIGdyYXBoaWNzLCBHbHlwaFZlY3Rv
ciBzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSkg
ewogICAgICAgICAgICBncmFwaGljcy5kcmF3R2x5cGhWZWN0b3Ioc3RyLCB4LCB5KTsKICAgICAg
ICB9CgogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3My
RCBncmFwaGljcywgU3RyaW5nIHN0ciwgaW50IHgsIGludCB5KSB7CiAgICAgICAgICAgIGdyYXBo
aWNzLmRyYXdTdHJpbmcoc3RyLCB4LCB5KTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCiAgICAvLyBHbHlwaC1ieS1nbHlwaCByZW5kZXJpbmcgc3VwcG9ydAogICAgLy8KCiAg
ICAvLyBBIHRlbXBvcmFyeSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBnYXJiYWdlIGNyZWF0aW9uCiAg
ICBwcml2YXRlIGZpbmFsIGNoYXJbXSBzaW5nbGVVbmljb2RlID0gbmV3IGNoYXJbMV07CgogICAg
LyoqIEEgR2x5cGggcmVwcmVzZW50cyBlaXRoZXIgYSBzaW5nbGUgdW5pY29kZSBnbHlwaCBvciBh
CiAgICAgICAgc3Vic3RyaW5nIG9mIGNoYXJhY3RlcnMgdG8gYmUgZHJhd24uIFRoZSByZWFzb24g
Zm9yIHRoZSBkdWFsCiAgICAgICAgYmVoYXZpb3IgaXMgc28gdGhhdCB3ZSBjYW4gdGFrZSBpbiBh
IHNlcXVlbmNlIG9mIHVuaWNvZGUKICAgICAgICBjaGFyYWN0ZXJzIGFuZCBwYXJ0aXRpb24gdGhl
bSBpbnRvIHJ1bnMgb2YgaW5kaXZpZHVhbCBnbHlwaHMsCiAgICAgICAgYnV0IGlmIHdlIGVuY291
bnRlciBjb21wbGV4IHRleHQgYW5kL29yIHVuaWNvZGUgc2VxdWVuY2VzIHdlCiAgICAgICAgZG9u
J3QgdW5kZXJzdGFuZCwgd2UgY2FuIHJlbmRlciB0aGVtIHVzaW5nIHRoZQogICAgICAgIHN0cmlu
Zy1ieS1zdHJpbmcgbWV0aG9kLiA8UD4KCiAgICAgICAgR2x5cGhzIG5lZWQgdG8gYmUgYWJsZSB0
byByZS11cGxvYWQgdGhlbXNlbHZlcyB0byB0aGUgYmFja2luZwogICAgICAgIHN0b3JlIG9uIGRl
bWFuZCBhcyB3ZSBnbyBhbG9uZyBpbiB0aGUgcmVuZGVyIHNlcXVlbmNlLgogICAgKi8KCiAgICBj
bGFzcyBHbHlwaCB7CiAgICAgICAgLy8gSWYgdGhpcyBHbHlwaCByZXByZXNlbnRzIGFuIGluZGl2
aWR1YWwgdW5pY29kZSBnbHlwaCwgdGhpcwogICAgICAgIC8vIGlzIGl0cyB1bmljb2RlIElELiBJ
ZiBpdCByZXByZXNlbnRzIGEgU3RyaW5nLCB0aGlzIGlzIC0xLgogICAgICAgIHByaXZhdGUgaW50
IHVuaWNvZGVJRDsKICAgICAgICAvLyBJZiB0aGUgYWJvdmUgZmllbGQgaXNuJ3QgLTEsIHRoZW4g
dGhlc2UgZmllbGRzIGFyZSB1c2VkLgogICAgICAgIC8vIFRoZSBnbHlwaCBjb2RlIGluIHRoZSBm
b250CiAgICAgICAgcHJpdmF0ZSBpbnQgZ2x5cGhDb2RlOwogICAgICAgIC8vIFRoZSBHbHlwaFBy
b2R1Y2VyIHdoaWNoIGNyZWF0ZWQgdXMKICAgICAgICBwcml2YXRlIEdseXBoUHJvZHVjZXIgcHJv
ZHVjZXI7CiAgICAgICAgLy8gVGhlIGFkdmFuY2Ugb2YgdGhpcyBnbHlwaAogICAgICAgIHByaXZh
dGUgZmxvYXQgYWR2YW5jZTsKICAgICAgICAvLyBUaGUgR2x5cGhWZWN0b3IgZm9yIHRoaXMgc2lu
Z2xlIGNoYXJhY3RlcjsgdGhpcyBpcyBwYXNzZWQKICAgICAgICAvLyBpbiBkdXJpbmcgY29uc3Ry
dWN0aW9uIGJ1dCBjbGVhcmVkIGR1cmluZyB0aGUgdXBsb2FkCiAgICAgICAgLy8gcHJvY2Vzcwog
ICAgICAgIHByaXZhdGUgR2x5cGhWZWN0b3Igc2luZ2xlVW5pY29kZUdseXBoVmVjdG9yOwogICAg
ICAgIC8vIFRoZSByZWN0YW5nbGUgb2YgdGhpcyBnbHlwaCBvbiB0aGUgYmFja2luZyBzdG9yZSwg
b3IgbnVsbAogICAgICAgIC8vIGlmIGl0IGhhcyBiZWVuIGNsZWFyZWQgZHVlIHRvIHNwYWNlIHBy
ZXNzdXJlCiAgICAgICAgcHJpdmF0ZSBSZWN0IGdseXBoUmVjdEZvclRleHR1cmVNYXBwaW5nOwog
ICAgICAgIC8vIElmIHRoaXMgR2x5cGggcmVwcmVzZW50cyBhIFN0cmluZywgdGhpcyBpcyB0aGUg
c2VxdWVuY2Ugb2YKICAgICAgICAvLyBjaGFyYWN0ZXJzCiAgICAgICAgcHJpdmF0ZSBTdHJpbmcg
c3RyOwogICAgICAgIC8vIFdoZXRoZXIgd2UgbmVlZCBhIHZhbGlkIGFkdmFuY2Ugd2hlbiByZW5k
ZXJpbmcgdGhpcyBzdHJpbmcKICAgICAgICAvLyAoaS5lLiwgd2hldGhlciBpdCBoYXMgb3RoZXIg
c2luZ2xlIGdseXBocyBjb21pbmcgYWZ0ZXIgaXQpCiAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5l
ZWRBZHZhbmNlOwoKICAgICAgICAvLyBDcmVhdGVzIGEgR2x5cGggcmVwcmVzZW50aW5nIGFuIGlu
ZGl2aWR1YWwgVW5pY29kZSBjaGFyYWN0ZXIKICAgICAgICBwdWJsaWMgR2x5cGgoaW50IHVuaWNv
ZGVJRCwKICAgICAgICAgICAgICAgICAgICAgaW50IGdseXBoQ29kZSwKICAgICAgICAgICAgICAg
ICAgICAgZmxvYXQgYWR2YW5jZSwKICAgICAgICAgICAgICAgICAgICAgR2x5cGhWZWN0b3Igc2lu
Z2xlVW5pY29kZUdseXBoVmVjdG9yLAogICAgICAgICAgICAgICAgICAgICBHbHlwaFByb2R1Y2Vy
IHByb2R1Y2VyKSB7CiAgICAgICAgICAgIHRoaXMudW5pY29kZUlEID0gdW5pY29kZUlEOwogICAg
ICAgICAgICB0aGlzLmdseXBoQ29kZSA9IGdseXBoQ29kZTsKICAgICAgICAgICAgdGhpcy5hZHZh
bmNlID0gYWR2YW5jZTsKICAgICAgICAgICAgdGhpcy5zaW5nbGVVbmljb2RlR2x5cGhWZWN0b3Ig
PSBzaW5nbGVVbmljb2RlR2x5cGhWZWN0b3I7CiAgICAgICAgICAgIHRoaXMucHJvZHVjZXIgPSBw
cm9kdWNlcjsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0ZXMgYSBHbHlwaCByZXByZXNlbnRp
bmcgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLCB3aXRoCiAgICAgICAgLy8gYW4gaW5kaWNhdGlv
biBvZiB3aGV0aGVyIGFkZGl0aW9uYWwgc2luZ2xlIGdseXBocyBhcmUgYmVpbmcKICAgICAgICAv
LyByZW5kZXJlZCBhZnRlciBpdAogICAgICAgIHB1YmxpYyBHbHlwaChTdHJpbmcgc3RyLCBib29s
ZWFuIG5lZWRBZHZhbmNlKSB7CiAgICAgICAgICAgIHRoaXMuc3RyID0gc3RyOwogICAgICAgICAg
ICB0aGlzLm5lZWRBZHZhbmNlID0gbmVlZEFkdmFuY2U7CiAgICAgICAgfQoKICAgICAgICAvKiog
UmV0dXJucyB0aGlzIGdseXBoJ3MgdW5pY29kZSBJRCAqLwogICAgICAgIHB1YmxpYyBpbnQgZ2V0
VW5pY29kZUlEKCkgewogICAgICAgICAgICByZXR1cm4gdW5pY29kZUlEOwogICAgICAgIH0KCiAg
ICAgICAgLyoqIFJldHVybnMgdGhpcyBnbHlwaCdzIChmb250LXNwZWNpZmljKSBnbHlwaCBjb2Rl
ICovCiAgICAgICAgcHVibGljIGludCBnZXRHbHlwaENvZGUoKSB7CiAgICAgICAgICAgIHJldHVy
biBnbHlwaENvZGU7CiAgICAgICAgfQoKICAgICAgICAvKiogUmV0dXJucyB0aGUgYWR2YW5jZSBm
b3IgdGhpcyBnbHlwaCAqLwogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRBZHZhbmNlKCkgewogICAg
ICAgICAgICByZXR1cm4gYWR2YW5jZTsKICAgICAgICB9CgogICAgICAgIC8qKiBEcmF3cyB0aGlz
IGdseXBoIGFuZCByZXR1cm5zIHRoZSAoeCkgYWR2YW5jZSBmb3IgdGhpcyBnbHlwaCAqLwogICAg
ICAgIHB1YmxpYyBmbG9hdCBkcmF3M0QoZmxvYXQgaW5YLCBmbG9hdCBpblksIGZsb2F0IHosIGZs
b2F0IHNjYWxlRmFjdG9yKSB7CiAgICAgICAgICAgIGlmIChzdHIgIT0gbnVsbCkgewogICAgICAg
ICAgICAgICAgZHJhdzNEX1JPQlVTVChzdHIsIGluWCwgaW5ZLCB6LCBzY2FsZUZhY3Rvcik7CiAg
ICAgICAgICAgICAgICBpZiAoIW5lZWRBZHZhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDb21wdXRlIGFuZCBy
ZXR1cm4gdGhlIGFkdmFuY2UgZm9yIHRoaXMgc3RyaW5nCiAgICAgICAgICAgICAgICBHbHlwaFZl
Y3RvciBndiA9IGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZ2V0Rm9udFJlbmRlckNvbnRleHQoKSwg
c3RyKTsKICAgICAgICAgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CiAgICAgICAgICAg
ICAgICBmb3IgKGludCBpID0gMDsgaSA8IGd2LmdldE51bUdseXBocygpOyBpKyspIHsKICAgICAg
ICAgICAgICAgICAgICB0b3RhbEFkdmFuY2UgKz0gZ3YuZ2V0R2x5cGhNZXRyaWNzKGkpLmdldEFk
dmFuY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbEFk
dmFuY2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNvZGUgcGF0
aCB0YWtlbiBmb3IgaW5kaXZpZHVhbCBnbHlwaHMKICAgICAgICAgICAgaWYgKGdseXBoUmVjdEZv
clRleHR1cmVNYXBwaW5nID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHVwbG9hZCgpOwogICAg
ICAgICAgICB9CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKG1QaXBlbGlu
ZWRRdWFkUmVuZGVyZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG1QaXBlbGluZWRR
dWFkUmVuZGVyZXIgPSBuZXcgUGlwZWxpbmVkX1F1YWRSZW5kZXJlcigpOwogICAgICAgICAgICAg
ICAgfQoKICAgICAgICAgICAgICAgIFRleHR1cmVSZW5kZXJlciByZW5kZXJlciA9IGdldEJhY2tp
bmdTdG9yZSgpOwogICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBjYXNlIHdoZXJlIE5QT1QgdGV4
dHVyZSBpcyB1c2VkIGZvciBiYWNraW5nIHN0b3JlCiAgICAgICAgICAgICAgICBUZXh0dXJlQ29v
cmRzIHdob2xlSW1hZ2VUZXhDb29yZHMgPSByZW5kZXJlci5nZXRUZXh0dXJlKCkuZ2V0SW1hZ2VU
ZXhDb29yZHMoKTsKICAgICAgICAgICAgICAgIGZsb2F0IHhTY2FsZSA9IHdob2xlSW1hZ2VUZXhD
b29yZHMucmlnaHQoKTsKICAgICAgICAgICAgICAgIGZsb2F0IHlTY2FsZSA9IHdob2xlSW1hZ2VU
ZXhDb29yZHMuYm90dG9tKCk7CgogICAgICAgICAgICAgICAgUmVjdCByZWN0ID0gZ2x5cGhSZWN0
Rm9yVGV4dHVyZU1hcHBpbmc7CiAgICAgICAgICAgICAgICBUZXh0RGF0YSBkYXRhID0gKFRleHRE
YXRhKSByZWN0LmdldFVzZXJEYXRhKCk7CiAgICAgICAgICAgICAgICBkYXRhLm1hcmtVc2VkKCk7
CgogICAgICAgICAgICAgICAgUmVjdGFuZ2xlMkQgb3JpZ1JlY3QgPSBkYXRhLm9yaWdSZWN0KCk7
CgogICAgICAgICAgICAgICAgZmxvYXQgeCA9IGluWCAtIChzY2FsZUZhY3RvciAqIGRhdGEub3Jp
Z09yaWdpblgoKSk7CiAgICAgICAgICAgICAgICBmbG9hdCB5ID0gaW5ZIC0gKHNjYWxlRmFjdG9y
ICogKChmbG9hdCkgb3JpZ1JlY3QuZ2V0SGVpZ2h0KCkgLSBkYXRhLm9yaWdPcmlnaW5ZKCkpKTsK
CiAgICAgICAgICAgICAgICBpbnQgdGV4dHVyZXggPSByZWN0LngoKSArIChkYXRhLm9yaWdpbigp
LnggLSBkYXRhLm9yaWdPcmlnaW5YKCkpOwogICAgICAgICAgICAgICAgaW50IHRleHR1cmV5ID0g
cmVuZGVyZXIuZ2V0SGVpZ2h0KCkgLSByZWN0LnkoKSAtIChpbnQpIG9yaWdSZWN0LmdldEhlaWdo
dCgpIC0KICAgICAgICAgICAgICAgICAgICAoZGF0YS5vcmlnaW4oKS55IC0gZGF0YS5vcmlnT3Jp
Z2luWSgpKTsKICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIG9yaWdSZWN0LmdldFdp
ZHRoKCk7CiAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgb3JpZ1JlY3QuZ2V0SGVp
Z2h0KCk7CgogICAgICAgICAgICAgICAgZmxvYXQgdHgxID0geFNjYWxlICogdGV4dHVyZXggLyBy
ZW5kZXJlci5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgZmxvYXQgdHkxID0geVNjYWxlICog
KDEuMGYgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpIHRl
eHR1cmV5IC8gKGZsb2F0KSByZW5kZXJlci5nZXRIZWlnaHQoKSkpOwogICAgICAgICAgICAgICAg
ZmxvYXQgdHgyID0geFNjYWxlICogKHRleHR1cmV4ICsgd2lkdGgpIC8gcmVuZGVyZXIuZ2V0V2lk
dGgoKTsKICAgICAgICAgICAgICAgIGZsb2F0IHR5MiA9IHlTY2FsZSAqICgxLjBmIC0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KSAodGV4dHVyZXkgKyBoZWln
aHQpIC8gKGZsb2F0KSByZW5kZXJlci5nZXRIZWlnaHQoKSkpOwoKICAgICAgICAgICAgICAgIG1Q
aXBlbGluZWRRdWFkUmVuZGVyZXIuZ2xUZXhDb29yZDJmKHR4MSwgdHkxKTsKICAgICAgICAgICAg
ICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZ2xWZXJ0ZXgzZih4LCB5LCB6KTsKICAgICAgICAg
ICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZ2xUZXhDb29yZDJmKHR4MiwgdHkxKTsKICAg
ICAgICAgICAgICAgIG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZ2xWZXJ0ZXgzZih4ICsgKHdpZHRo
ICogc2NhbGVGYWN0b3IpLCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHopOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5n
bFRleENvb3JkMmYodHgyLCB0eTIpOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5k
ZXJlci5nbFZlcnRleDNmKHggKyAod2lkdGggKiBzY2FsZUZhY3RvciksCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSArIChoZWlnaHQgKiBzY2FsZUZh
Y3RvciksIHopOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5nbFRleENv
b3JkMmYodHgxLCB0eTIpOwogICAgICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5n
bFZlcnRleDNmKHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgeSArIChoZWlnaHQgKiBzY2FsZUZhY3RvciksIHopOwogICAgICAgICAgICB9IGNhdGNo
IChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAg
ICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYWR2YW5jZTsKICAgICAgICB9CgogICAgICAg
IC8qKiBOb3RpZmllcyB0aGlzIGdseXBoIHRoYXQgaXQncyBiZWVuIGNsZWFyZWQgb3V0IG9mIHRo
ZSBjYWNoZSAqLwogICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogICAgICAgICAgICBnbHlw
aFJlY3RGb3JUZXh0dXJlTWFwcGluZyA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRl
IHZvaWQgdXBsb2FkKCkgewogICAgICAgICAgICBHbHlwaFZlY3RvciBndiA9IGdldEdseXBoVmVj
dG9yKCk7CiAgICAgICAgICAgIFJlY3RhbmdsZTJEIG9yaWdCQm94ID0gcHJlTm9ybWFsaXplKHJl
bmRlckRlbGVnYXRlLmdldEJvdW5kcyhndiwgZ2V0Rm9udFJlbmRlckNvbnRleHQoKSkpOwogICAg
ICAgICAgICBSZWN0YW5nbGUyRCBiYm94ID0gbm9ybWFsaXplKG9yaWdCQm94KTsKICAgICAgICAg
ICAgUG9pbnQgb3JpZ2luID0gbmV3IFBvaW50KChpbnQpIC1iYm94LmdldE1pblgoKSwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIC1iYm94LmdldE1pblkoKSk7CiAg
ICAgICAgICAgIFJlY3QgcmVjdCA9IG5ldyBSZWN0KDAsIDAsIChpbnQpIGJib3guZ2V0V2lkdGgo
KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgYmJveC5nZXRIZWlnaHQo
KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHREYXRhKG51bGwsIG9y
aWdpbiwgb3JpZ0JCb3gsIHVuaWNvZGVJRCkpOwogICAgICAgICAgICBwYWNrZXIuYWRkKHJlY3Qp
OwogICAgICAgICAgICBnbHlwaFJlY3RGb3JUZXh0dXJlTWFwcGluZyA9IHJlY3Q7CiAgICAgICAg
ICAgIEdyYXBoaWNzMkQgZyA9IGdldEdyYXBoaWNzMkQoKTsKICAgICAgICAgICAgLy8gT0ssIHNo
b3VsZCBub3cgaGF2ZSBhbiAoeCwgeSkgZm9yIHRoaXMgcmVjdGFuZ2xlOyByYXN0ZXJpemUKICAg
ICAgICAgICAgLy8gdGhlIGdseXBoCiAgICAgICAgICAgIGludCBzdHJ4ID0gcmVjdC54KCkgKyBv
cmlnaW4ueDsKICAgICAgICAgICAgaW50IHN0cnkgPSByZWN0LnkoKSArIG9yaWdpbi55OwoKICAg
ICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBhcmVhIHdlJ3JlIGdvaW5nIHRvIGRyYXcgaW50bwog
ICAgICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0ZS5DbGVhcik7CiAgICAgICAg
ICAgIGcuZmlsbFJlY3QocmVjdC54KCksIHJlY3QueSgpLCByZWN0LncoKSwgcmVjdC5oKCkpOwog
ICAgICAgICAgICBnLnNldENvbXBvc2l0ZShBbHBoYUNvbXBvc2l0ZS5TcmMpOwoKICAgICAgICAg
ICAgLy8gRHJhdyB0aGUgc3RyaW5nCiAgICAgICAgICAgIHJlbmRlckRlbGVnYXRlLmRyYXdHbHlw
aFZlY3RvcihnLCBndiwgc3RyeCwgc3RyeSk7CgogICAgICAgICAgICBpZiAoRFJBV19CQk9YRVMp
IHsKICAgICAgICAgICAgICAgIFRleHREYXRhIGRhdGEgPSAoVGV4dERhdGEpIHJlY3QuZ2V0VXNl
ckRhdGEoKTsKICAgICAgICAgICAgICAgIC8vIERyYXcgYSBib3VuZGluZyBib3ggb24gdGhlIGJh
Y2tpbmcgc3RvcmUKICAgICAgICAgICAgICAgIGcuZHJhd1JlY3Qoc3RyeCAtIGRhdGEub3JpZ09y
aWdpblgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyeSAtIGRhdGEub3JpZ09yaWdp
blkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgZGF0YS5vcmlnUmVjdCgpLmdl
dFdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIGRhdGEub3JpZ1JlY3Qo
KS5nZXRIZWlnaHQoKSk7CiAgICAgICAgICAgICAgICBnLmRyYXdSZWN0KHN0cnggLSBkYXRhLm9y
aWdpbigpLngsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnkgLSBkYXRhLm9yaWdpbigp
LnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudygpLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICByZWN0LmgoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1hcmsg
dGhpcyByZWdpb24gb2YgdGhlIFRleHR1cmVSZW5kZXJlciBhcyBkaXJ0eQogICAgICAgICAgICBn
ZXRCYWNraW5nU3RvcmUoKS5tYXJrRGlydHkocmVjdC54KCksIHJlY3QueSgpLCByZWN0LncoKSwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaCgpKTsKICAgICAg
ICAgICAgLy8gUmUtcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggb3VyIHByb2R1Y2VyCiAgICAgICAg
ICAgIHByb2R1Y2VyLnJlZ2lzdGVyKHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgcHJpdmF0ZSBH
bHlwaFZlY3RvciBnZXRHbHlwaFZlY3RvcigpIHsKICAgICAgICAgICAgR2x5cGhWZWN0b3IgZ3Yg
PSBzaW5nbGVVbmljb2RlR2x5cGhWZWN0b3I7CiAgICAgICAgICAgIGlmIChndiAhPSBudWxsKSB7
CiAgICAgICAgICAgICAgICBzaW5nbGVVbmljb2RlR2x5cGhWZWN0b3IgPSBudWxsOyAvLyBEb24n
dCBuZWVkIHRoaXMgYW55bW9yZQogICAgICAgICAgICAgICAgcmV0dXJuIGd2OwogICAgICAgICAg
ICB9CiAgICAgICAgICAgIHNpbmdsZVVuaWNvZGVbMF0gPSAoY2hhcikgdW5pY29kZUlEOwogICAg
ICAgICAgICByZXR1cm4gZm9udC5jcmVhdGVHbHlwaFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4
dCgpLCBzaW5nbGVVbmljb2RlKTsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgR2x5cGhQcm9k
dWNlciB7CiAgICAgICAgZmluYWwgaW50IHVuZGVmaW5lZCA9IC0yOwogICAgICAgIEZvbnRSZW5k
ZXJDb250ZXh0IGZvbnRSZW5kZXJDb250ZXh0OwogICAgICAgIExpc3Q8R2x5cGg+IGdseXBoc091
dHB1dCA9IG5ldyBBcnJheUxpc3Q8R2x5cGg+KCk7CiAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEds
eXBoVmVjdG9yPiBmdWxsR2x5cGhWZWN0b3JDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgR2x5
cGhWZWN0b3I+KCk7CiAgICAgICAgSGFzaE1hcDxDaGFyYWN0ZXIsIEdseXBoTWV0cmljcz4gZ2x5
cGhNZXRyaWNzQ2FjaGUgPSBuZXcgSGFzaE1hcDxDaGFyYWN0ZXIsIEdseXBoTWV0cmljcz4oKTsK
ICAgICAgICAvLyBUaGUgbWFwcGluZyBmcm9tIHVuaWNvZGUgY2hhcmFjdGVyIHRvIGZvbnQtc3Bl
Y2lmaWMgZ2x5cGggSUQKICAgICAgICBpbnRbXSB1bmljb2RlczJHbHlwaHM7CiAgICAgICAgLy8g
VGhlIG1hcHBpbmcgZnJvbSBnbHlwaCBJRCB0byBHbHlwaAogICAgICAgIEdseXBoW10gZ2x5cGhD
YWNoZTsKICAgICAgICAvLyBXZSByZS11c2UgdGhpcyBmb3IgZWFjaCBpbmNvbWluZyBzdHJpbmcK
ICAgICAgICBDaGFyU2VxdWVuY2VJdGVyYXRvciBpdGVyID0gbmV3IENoYXJTZXF1ZW5jZUl0ZXJh
dG9yKCk7CgogICAgICAgIEdseXBoUHJvZHVjZXIoaW50IGZvbnRMZW5ndGhJbkdseXBocykgewog
ICAgICAgICAgICB1bmljb2RlczJHbHlwaHMgPSBuZXcgaW50WzUxMl07CiAgICAgICAgICAgIGds
eXBoQ2FjaGUgPSBuZXcgR2x5cGhbZm9udExlbmd0aEluR2x5cGhzXTsKICAgICAgICAgICAgY2xl
YXJBbGxDYWNoZUVudHJpZXMoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBMaXN0PEdseXBo
PiBnZXRHbHlwaHMoQ2hhclNlcXVlbmNlIGluU3RyaW5nKSB7CiAgICAgICAgICAgIGdseXBoc091
dHB1dC5jbGVhcigpOwogICAgICAgICAgICBHbHlwaFZlY3RvciBmdWxsUnVuR2x5cGhWZWN0b3I7
CiAgICAgICAgICAgIGZ1bGxSdW5HbHlwaFZlY3RvciA9IGZ1bGxHbHlwaFZlY3RvckNhY2hlLmdl
dChpblN0cmluZy50b1N0cmluZygpKTsKICAgICAgICAgICAgaWYgKGZ1bGxSdW5HbHlwaFZlY3Rv
ciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpdGVyLmluaXRGcm9tQ2hhclNlcXVlbmNlKGlu
U3RyaW5nKTsKICAgICAgICAgICAgICAgIGZ1bGxSdW5HbHlwaFZlY3RvciA9IGZvbnQuY3JlYXRl
R2x5cGhWZWN0b3IoZ2V0Rm9udFJlbmRlckNvbnRleHQoKSwgaXRlcik7CiAgICAgICAgICAgICAg
ICBmdWxsR2x5cGhWZWN0b3JDYWNoZS5wdXQoaW5TdHJpbmcudG9TdHJpbmcoKSwgZnVsbFJ1bkds
eXBoVmVjdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBib29sZWFuIGNvbXBsZXggPSAo
ZnVsbFJ1bkdseXBoVmVjdG9yLmdldExheW91dEZsYWdzKCkgIT0gMCk7CiAgICAgICAgICAgIGlm
IChjb21wbGV4IHx8IERJU0FCTEVfR0xZUEhfQ0FDSEUpIHsKICAgICAgICAgICAgICAgIC8vIFB1
bnQgdG8gdGhlIHJvYnVzdCB2ZXJzaW9uIG9mIHRoZSByZW5kZXJlcgogICAgICAgICAgICAgICAg
Z2x5cGhzT3V0cHV0LmFkZChuZXcgR2x5cGgoaW5TdHJpbmcudG9TdHJpbmcoKSwgZmFsc2UpKTsK
ICAgICAgICAgICAgICAgIHJldHVybiBnbHlwaHNPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAg
ICAgICAgIGludCBsZW5ndGhJbkdseXBocyA9IGZ1bGxSdW5HbHlwaFZlY3Rvci5nZXROdW1HbHlw
aHMoKTsKICAgICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICAgICB3aGlsZSAoaSA8IGxlbmd0
aEluR2x5cGhzKSB7CiAgICAgICAgICAgICAgICBDaGFyYWN0ZXIgbGV0dGVyID0gQ2hhcmFjdGVy
Q2FjaGUudmFsdWVPZihpblN0cmluZy5jaGFyQXQoaSkpOwogICAgICAgICAgICAgICAgR2x5cGhN
ZXRyaWNzIG1ldHJpY3MgPSBnbHlwaE1ldHJpY3NDYWNoZS5nZXQobGV0dGVyKTsKICAgICAgICAg
ICAgICAgIGlmIChtZXRyaWNzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBtZXRyaWNz
ID0gZnVsbFJ1bkdseXBoVmVjdG9yLmdldEdseXBoTWV0cmljcyhpKTsKICAgICAgICAgICAgICAg
ICAgICBnbHlwaE1ldHJpY3NDYWNoZS5wdXQobGV0dGVyLCBtZXRyaWNzKTsKICAgICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgICAgIEdseXBoIGdseXBoID0gZ2V0R2x5cGgoaW5TdHJpbmcsIG1l
dHJpY3MsIGkpOwogICAgICAgICAgICAgICAgaWYgKGdseXBoICE9IG51bGwpIHsKICAgICAgICAg
ICAgICAgICAgICBnbHlwaHNPdXRwdXQuYWRkKGdseXBoKTsKICAgICAgICAgICAgICAgICAgICBp
Kys7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEFzc2Vt
YmxlIGEgcnVuIG9mIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBmaXQgaW4KICAgICAgICAgICAgICAg
ICAgICAvLyB0aGUgY2FjaGUKICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9
IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBsZW5n
dGhJbkdseXBocyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRHbHlwaChpblN0cmlu
ZywgZnVsbFJ1bkdseXBoVmVjdG9yLmdldEdseXBoTWV0cmljcyhpKSwgaSkgPT0gbnVsbCkgewog
ICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGluU3RyaW5nLmNoYXJBdChpKyspKTsK
ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2x5cGhzT3V0cHV0LmFk
ZChuZXcgR2x5cGgoYnVmLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gQW55IG1vcmUgZ2x5cGhzIGFmdGVyIHRoaXMgcnVuPwogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBsZW5ndGhJbkds
eXBocykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVy
biBnbHlwaHNPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBjbGVhckNhY2hl
RW50cnkoaW50IHVuaWNvZGVJRCkgewogICAgICAgICAgICBpbnQgZ2x5cGhJRCA9IHVuaWNvZGVz
MkdseXBoc1t1bmljb2RlSURdOwogICAgICAgICAgICBpZiAoZ2x5cGhJRCAhPSB1bmRlZmluZWQp
IHsKICAgICAgICAgICAgICAgIEdseXBoIGdseXBoID0gZ2x5cGhDYWNoZVtnbHlwaElEXTsKICAg
ICAgICAgICAgICAgIGlmIChnbHlwaCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZ2x5
cGguY2xlYXIoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdseXBoQ2FjaGVb
Z2x5cGhJRF0gPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBo
c1t1bmljb2RlSURdID0gdW5kZWZpbmVkOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQg
Y2xlYXJBbGxDYWNoZUVudHJpZXMoKSB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
dW5pY29kZXMyR2x5cGhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjbGVhckNhY2hl
RW50cnkoaSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHJl
Z2lzdGVyKEdseXBoIGdseXBoKSB7CiAgICAgICAgICAgIHVuaWNvZGVzMkdseXBoc1tnbHlwaC5n
ZXRVbmljb2RlSUQoKV0gPSBnbHlwaC5nZXRHbHlwaENvZGUoKTsKICAgICAgICAgICAgZ2x5cGhD
YWNoZVtnbHlwaC5nZXRHbHlwaENvZGUoKV0gPSBnbHlwaDsKICAgICAgICB9CgogICAgICAgIHB1
YmxpYyBmbG9hdCBnZXRHbHlwaFBpeGVsV2lkdGgoY2hhciB1bmljb2RlSUQpIHsKICAgICAgICAg
ICAgR2x5cGggZ2x5cGggPSBnZXRHbHlwaCh1bmljb2RlSUQpOwogICAgICAgICAgICBpZiAoZ2x5
cGggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGdseXBoLmdldEFkdmFuY2UoKTsK
ICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSGF2ZSB0byBkbyB0aGlzIHRoZSBoYXJkIC8g
dW5jYWNoZWQgd2F5CiAgICAgICAgICAgIHNpbmdsZVVuaWNvZGVbMF0gPSB1bmljb2RlSUQ7CiAg
ICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZm9udC5jcmVhdGVHbHlwaFZlY3Rvcihmb250UmVu
ZGVyQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVVbmljb2RlKTsKICAgICAgICAgICAgcmV0dXJu
IGd2LmdldEdseXBoTWV0cmljcygwKS5nZXRBZHZhbmNlKCk7CiAgICAgICAgfQoKICAgICAgICAv
LyBSZXR1cm5zIGEgZ2x5cGggb2JqZWN0IGZvciB0aGlzIHNpbmdsZSBnbHlwaC4gUmV0dXJucyBu
dWxsCiAgICAgICAgLy8gaWYgdGhlIHVuaWNvZGUgb3IgZ2x5cGggSUQgd291bGQgYmUgb3V0IG9m
IGJvdW5kcyBvZiB0aGUKICAgICAgICAvLyBnbHlwaCBjYWNoZS4KICAgICAgICBwcml2YXRlIEds
eXBoIGdldEdseXBoKENoYXJTZXF1ZW5jZSBpblN0cmluZywKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIEdseXBoTWV0cmljcyBnbHlwaE1ldHJpY3MsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbnQgaW5kZXgpIHsKICAgICAgICAgICAgY2hhciB1bmljb2RlSUQgPSBpblN0
cmluZy5jaGFyQXQoaW5kZXgpOwoKICAgICAgICAgICAgaWYgKHVuaWNvZGVJRCA+PSB1bmljb2Rl
czJHbHlwaHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAg
ICAgfQoKICAgICAgICAgICAgaW50IGdseXBoSUQgPSB1bmljb2RlczJHbHlwaHNbdW5pY29kZUlE
XTsKICAgICAgICAgICAgaWYgKGdseXBoSUQgIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAg
ICByZXR1cm4gZ2x5cGhDYWNoZVtnbHlwaElEXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAg
Ly8gTXVzdCBmYWJyaWNhdGUgdGhlIGdseXBoCiAgICAgICAgICAgIHNpbmdsZVVuaWNvZGVbMF0g
PSB1bmljb2RlSUQ7CiAgICAgICAgICAgIEdseXBoVmVjdG9yIGd2ID0gZm9udC5jcmVhdGVHbHlw
aFZlY3RvcihnZXRGb250UmVuZGVyQ29udGV4dCgpLCBzaW5nbGVVbmljb2RlKTsKICAgICAgICAg
ICAgcmV0dXJuIGdldEdseXBoKHVuaWNvZGVJRCwgZ3YsIGdseXBoTWV0cmljcyk7CiAgICAgICAg
fQoKICAgICAgICAvLyBJdCdzIHVuY2xlYXIgd2hldGhlciB0aGlzIHZhcmlhbnQgbWlnaHQgcHJv
ZHVjZSBsZXNzCiAgICAgICAgLy8gb3B0aW1hbCByZXN1bHRzIHRoYW4gaWYgd2UgY2FuIHNlZSB0
aGUgZW50aXJlIEdseXBoVmVjdG9yCiAgICAgICAgLy8gZm9yIHRoZSBpbmNvbWluZyBzdHJpbmcK
ICAgICAgICBwcml2YXRlIEdseXBoIGdldEdseXBoKGludCB1bmljb2RlSUQpIHsKICAgICAgICAg
ICAgaWYgKHVuaWNvZGVJRCA+PSB1bmljb2RlczJHbHlwaHMubGVuZ3RoKSB7CiAgICAgICAgICAg
ICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaW50IGdseXBoSUQg
PSB1bmljb2RlczJHbHlwaHNbdW5pY29kZUlEXTsKICAgICAgICAgICAgaWYgKGdseXBoSUQgIT0g
dW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2x5cGhDYWNoZVtnbHlwaElEXTsK
ICAgICAgICAgICAgfQogICAgICAgICAgICBzaW5nbGVVbmljb2RlWzBdID0gKGNoYXIpIHVuaWNv
ZGVJRDsKICAgICAgICAgICAgR2x5cGhWZWN0b3IgZ3YgPSBmb250LmNyZWF0ZUdseXBoVmVjdG9y
KGdldEZvbnRSZW5kZXJDb250ZXh0KCksIHNpbmdsZVVuaWNvZGUpOwogICAgICAgICAgICByZXR1
cm4gZ2V0R2x5cGgodW5pY29kZUlELCBndiwgZ3YuZ2V0R2x5cGhNZXRyaWNzKDApKTsKICAgICAg
ICB9CgogICAgICAgIHByaXZhdGUgR2x5cGggZ2V0R2x5cGgoaW50IHVuaWNvZGVJRCwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoVmVjdG9yIHNpbmdsZVVuaWNvZGVHbHlwaFZl
Y3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoTWV0cmljcyBtZXRyaWNz
KSB7CiAgICAgICAgICAgIGludCBnbHlwaENvZGUgPSBzaW5nbGVVbmljb2RlR2x5cGhWZWN0b3Iu
Z2V0R2x5cGhDb2RlKDApOwogICAgICAgICAgICAvLyBIYXZlIHNlZW4gaHVnZSBnbHlwaCBjb2Rl
cyAoNjU1MzYpIGNvbWluZyBvdXQgb2Ygc29tZSBmb250cyBpbiBzb21lIFVuaWNvZGUgc2l0dWF0
aW9ucwogICAgICAgICAgICBpZiAoZ2x5cGhDb2RlID49IGdseXBoQ2FjaGUubGVuZ3RoKSB7CiAg
ICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBHbHlw
aCBnbHlwaCA9IG5ldyBHbHlwaCh1bmljb2RlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGdseXBoQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bWV0cmljcy5nZXRBZHZhbmNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHNpbmdsZVVuaWNvZGVHbHlwaFZlY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdGhpcyk7CiAgICAgICAgICAgIHJlZ2lzdGVyKGdseXBoKTsKICAgICAgICAgICAgcmV0
dXJuIGdseXBoOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFy
YWN0ZXJDYWNoZSB7CiAgICAgICAgcHJpdmF0ZSBDaGFyYWN0ZXJDYWNoZSgpIHsKICAgICAgICB9
CgogICAgICAgIHN0YXRpYyBmaW5hbCBDaGFyYWN0ZXIgY2FjaGVbXSA9IG5ldyBDaGFyYWN0ZXJb
MTI3ICsgMV07CgogICAgICAgIHN0YXRpYyB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgY2FjaGUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhY2hlW2ldID0gbmV3IENo
YXJhY3RlcigoY2hhcikgaSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1Ymxp
YyBzdGF0aWMgQ2hhcmFjdGVyIHZhbHVlT2YoY2hhciBjKSB7CiAgICAgICAgICAgIGlmIChjIDw9
IDEyNykgeyAvLyBtdXN0IGNhY2hlCiAgICAgICAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyQ2Fj
aGUuY2FjaGVbY107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0
ZXIoYyk7CiAgICAgICAgfQogICAgfQoKICAgIGNsYXNzIFBpcGVsaW5lZF9RdWFkUmVuZGVyZXIg
ewogICAgICAgIGludCBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lID0gMDsKICAg
ICAgICBGbG9hdEJ1ZmZlciBtVGV4Q29vcmRzOwogICAgICAgIEZsb2F0QnVmZmVyIG1WZXJ0Q29v
cmRzOwogICAgICAgIGJvb2xlYW4gdXNpbmdWQk9zOwogICAgICAgIGludCBtVkJPX0Zvcl9SZXN1
YWJsZVRpbGVWZXJ0aWNlczsKICAgICAgICBpbnQgbVZCT19Gb3JfUmVzdWFibGVUaWxlVGV4Q29v
cmRzOwoKICAgICAgICBQaXBlbGluZWRfUXVhZFJlbmRlcmVyKCkgewogICAgICAgICAgICBHTDIg
Z2wgPSBHTENvbnRleHQuZ2V0Q3VycmVudEdMKCkuZ2V0R0wyKCk7CiAgICAgICAgICAgIG1WZXJ0
Q29vcmRzID0gQnVmZmVycy5uZXdEaXJlY3RGbG9hdEJ1ZmZlcihrVG90YWxCdWZmZXJTaXplQ29v
cmRzVmVydHMpOwogICAgICAgICAgICBtVGV4Q29vcmRzID0gQnVmZmVycy5uZXdEaXJlY3RGbG9h
dEJ1ZmZlcihrVG90YWxCdWZmZXJTaXplQ29vcmRzVGV4KTsKCiAgICAgICAgICAgIHVzaW5nVkJP
cyA9IGdldFVzZVZlcnRleEFycmF5cygpICYmIGlzMTVBdmFpbGFibGUoZ2wpOwoKICAgICAgICAg
ICAgaWYgKHVzaW5nVkJPcykgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAg
ICAgICBpbnRbXSB2Ym9zID0gbmV3IGludFsyXTsKICAgICAgICAgICAgICAgICAgICBnbC5nbEdl
bkJ1ZmZlcnMoMiwgSW50QnVmZmVyLndyYXAodmJvcykpOwoKICAgICAgICAgICAgICAgICAgICBt
VkJPX0Zvcl9SZXN1YWJsZVRpbGVWZXJ0aWNlcyA9IHZib3NbMF07CiAgICAgICAgICAgICAgICAg
ICAgbVZCT19Gb3JfUmVzdWFibGVUaWxlVGV4Q29vcmRzID0gdmJvc1sxXTsKCiAgICAgICAgICAg
ICAgICAgICAgZ2wuZ2xCaW5kQnVmZmVyKEdMMi5HTF9BUlJBWV9CVUZGRVIsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1WQk9fRm9yX1Jlc3VhYmxlVGlsZVZlcnRpY2VzKTsK
ICAgICAgICAgICAgICAgICAgICBnbC5nbEJ1ZmZlckRhdGEoR0wyLkdMX0FSUkFZX0JVRkZFUiwg
a1RvdGFsQnVmZmVyU2l6ZUJ5dGVzVmVydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG51bGwsIEdMMi5HTF9TVFJFQU1fRFJBVyk7IC8vIHN0cmVhbSBkcmF3IGJlY2F1c2Ug
dGhpcyBpcyBhIHNpbmdsZSBxdWFkIHVzZSBwaXBlbGluZQoKICAgICAgICAgICAgICAgICAgICBn
bC5nbEJpbmRCdWZmZXIoR0wyLkdMX0FSUkFZX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbVZCT19Gb3JfUmVzdWFibGVUaWxlVGV4Q29vcmRzKTsKICAgICAgICAg
ICAgICAgICAgICBnbC5nbEJ1ZmZlckRhdGEoR0wyLkdMX0FSUkFZX0JVRkZFUiwga1RvdGFsQnVm
ZmVyU2l6ZUJ5dGVzVGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxs
LCBHTDIuR0xfU1RSRUFNX0RSQVcpOyAvLyBzdHJlYW0gZHJhdyBiZWNhdXNlIHRoaXMgaXMgYSBz
aW5nbGUgcXVhZCB1c2UgcGlwZWxpbmUKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlv
biBlKSB7CiAgICAgICAgICAgICAgICAgICAgaXNFeHRlbnNpb25BdmFpbGFibGVfR0xfVkVSU0lP
Tl8xXzUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB1c2luZ1ZCT3MgPSBmYWxzZTsKICAg
ICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZv
aWQgZ2xUZXhDb29yZDJmKGZsb2F0IHYsIGZsb2F0IHYxKSB7CiAgICAgICAgICAgIG1UZXhDb29y
ZHMucHV0KHYpOwogICAgICAgICAgICBtVGV4Q29vcmRzLnB1dCh2MSk7CiAgICAgICAgfQoKICAg
ICAgICBwdWJsaWMgdm9pZCBnbFZlcnRleDNmKGZsb2F0IGluWCwgZmxvYXQgaW5ZLCBmbG9hdCBp
blopIHsKICAgICAgICAgICAgbVZlcnRDb29yZHMucHV0KGluWCk7CiAgICAgICAgICAgIG1WZXJ0
Q29vcmRzLnB1dChpblkpOwogICAgICAgICAgICBtVmVydENvb3Jkcy5wdXQoaW5aKTsKCiAgICAg
ICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUrKzsKCiAgICAgICAgICAg
IGlmIChtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lID49IGtUb3RhbEJ1ZmZlclNp
emVWZXJ0cykgewogICAgICAgICAgICAgICAgdGhpcy5kcmF3KCk7CiAgICAgICAgICAgIH0KICAg
ICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCBkcmF3KCkgewogICAgICAgICAgICBpZiAodXNl
VmVydGV4QXJyYXlzKSB7CiAgICAgICAgICAgICAgICBkcmF3VmVydGV4QXJyYXlzKCk7CiAgICAg
ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkcmF3SU1NRURJQVRFKCk7CiAgICAgICAg
ICAgIH0KICAgICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCBkcmF3VmVydGV4QXJyYXlzKCkg
ewogICAgICAgICAgICBpZiAobU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSA+IDAp
IHsKICAgICAgICAgICAgICAgIEdMMiBnbCA9IEdMQ29udGV4dC5nZXRDdXJyZW50R0woKS5nZXRH
TDIoKTsKCiAgICAgICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXIgPSBnZXRCYWNr
aW5nU3RvcmUoKTsKICAgICAgICAgICAgICAgIHJlbmRlcmVyLmdldFRleHR1cmUoKTsgLy8gdHJp
Z2dlcnMgdGV4dHVyZSB1cGxvYWRzLiAgTWF5YmUgdGhpcyBzaG91bGQgYmUgbW9yZSBvYnZpb3Vz
PwoKICAgICAgICAgICAgICAgIG1WZXJ0Q29vcmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAg
bVRleENvb3Jkcy5yZXdpbmQoKTsKCiAgICAgICAgICAgICAgICBnbC5nbEVuYWJsZUNsaWVudFN0
YXRlKEdMMi5HTF9WRVJURVhfQVJSQVkpOwoKICAgICAgICAgICAgICAgIGlmICh1c2luZ1ZCT3Mp
IHsKICAgICAgICAgICAgICAgICAgICBnbC5nbEJpbmRCdWZmZXIoR0wyLkdMX0FSUkFZX0JVRkZF
UiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZCT19Gb3JfUmVzdWFibGVU
aWxlVmVydGljZXMpOwogICAgICAgICAgICAgICAgICAgIGdsLmdsQnVmZmVyU3ViRGF0YShHTDIu
R0xfQVJSQVlfQlVGRkVSLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtT3V0c3RhbmRpbmdHbHlwaHNWZXJ0aWNlc1BpcGVsaW5lICoga1NpemVJbkJ5dGVzX09uZVZl
cnRpY2VzX1ZlcnRleERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1WZXJ0Q29vcmRzKTsgLy8gdXBsb2FkIG9ubHkgdGhlIG5ldyBzdHVmZgogICAgICAgICAgICAg
ICAgICAgIGdsLmdsVmVydGV4UG9pbnRlcigzLCBHTDIuR0xfRkxPQVQsIDAsIDApOwogICAgICAg
ICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBnbC5nbFZlcnRleFBvaW50ZXIo
MywgR0wyLkdMX0ZMT0FULCAwLCBtVmVydENvb3Jkcyk7CiAgICAgICAgICAgICAgICB9CgogICAg
ICAgICAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTDIuR0xfVEVYVFVSRV9DT09SRF9B
UlJBWSk7CgogICAgICAgICAgICAgICAgaWYgKHVzaW5nVkJPcykgewogICAgICAgICAgICAgICAg
ICAgIGdsLmdsQmluZEJ1ZmZlcihHTDIuR0xfQVJSQVlfQlVGRkVSLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVUZXhDb29yZHMpOwogICAg
ICAgICAgICAgICAgICAgIGdsLmdsQnVmZmVyU3ViRGF0YShHTDIuR0xfQVJSQVlfQlVGRkVSLCAw
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0c3RhbmRpbmdHbHlw
aHNWZXJ0aWNlc1BpcGVsaW5lICoga1NpemVJbkJ5dGVzX09uZVZlcnRpY2VzX1RleERhdGEsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXhDb29yZHMpOyAvLyB1cGxv
YWQgb25seSB0aGUgbmV3IHN0dWZmCiAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZFBv
aW50ZXIoMiwgR0wyLkdMX0ZMT0FULCAwLCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAg
ICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0wyLkdMX0ZMT0FULCAw
LCBtVGV4Q29vcmRzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBnbC5nbERy
YXdBcnJheXMoR0wyLkdMX1FVQURTLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUpOwoKICAgICAgICAgICAgICAgIG1W
ZXJ0Q29vcmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAgbVRleENvb3Jkcy5yZXdpbmQoKTsK
ICAgICAgICAgICAgICAgIG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUgPSAwOwog
ICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0lNTUVESUFU
RSgpIHsKICAgICAgICAgICAgaWYgKG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlwZWxpbmUg
PiAwKSB7CiAgICAgICAgICAgICAgICBUZXh0dXJlUmVuZGVyZXIgcmVuZGVyZXIgPSBnZXRCYWNr
aW5nU3RvcmUoKTsKICAgICAgICAgICAgICAgIHJlbmRlcmVyLmdldFRleHR1cmUoKTsgLy8gdHJp
Z2dlcnMgdGV4dHVyZSB1cGxvYWRzLiAgTWF5YmUgdGhpcyBzaG91bGQgYmUgbW9yZSBvYnZpb3Vz
PwoKICAgICAgICAgICAgICAgIEdMMiBnbCA9IEdMQ29udGV4dC5nZXRDdXJyZW50R0woKS5nZXRH
TDIoKTsKICAgICAgICAgICAgICAgIGdsLmdsQmVnaW4oR0wyLkdMX1FVQURTKTsKCiAgICAgICAg
ICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJPZlF1YWRzID0gbU91
dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSAvIDQ7CiAgICAgICAgICAgICAgICAgICAg
bVZlcnRDb29yZHMucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgbVRleENvb3Jkcy5yZXdp
bmQoKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlF1
YWRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZDJmKG1UZXhD
b29yZHMuZ2V0KCksIG1UZXhDb29yZHMuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICBn
bC5nbFZlcnRleDNmKG1WZXJ0Q29vcmRzLmdldCgpLCBtVmVydENvb3Jkcy5nZXQoKSwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQoKSk7CgogICAg
ICAgICAgICAgICAgICAgICAgICBnbC5nbFRleENvb3JkMmYobVRleENvb3Jkcy5nZXQoKSwgbVRl
eENvb3Jkcy5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmdsVmVydGV4M2YobVZl
cnRDb29yZHMuZ2V0KCksIG1WZXJ0Q29vcmRzLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1WZXJ0Q29vcmRzLmdldCgpKTsKCiAgICAgICAgICAgICAgICAgICAg
ICAgIGdsLmdsVGV4Q29vcmQyZihtVGV4Q29vcmRzLmdldCgpLCBtVGV4Q29vcmRzLmdldCgpKTsK
ICAgICAgICAgICAgICAgICAgICAgICAgZ2wuZ2xWZXJ0ZXgzZihtVmVydENvb3Jkcy5nZXQoKSwg
bVZlcnRDb29yZHMuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bVZlcnRDb29yZHMuZ2V0KCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29y
ZDJmKG1UZXhDb29yZHMuZ2V0KCksIG1UZXhDb29yZHMuZ2V0KCkpOwogICAgICAgICAgICAgICAg
ICAgICAgICBnbC5nbFZlcnRleDNmKG1WZXJ0Q29vcmRzLmdldCgpLCBtVmVydENvb3Jkcy5nZXQo
KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5nZXQo
KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0
aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAg
ICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICBnbC5nbEVuZCgpOwogICAg
ICAgICAgICAgICAgICAgIG1WZXJ0Q29vcmRzLnJld2luZCgpOwogICAgICAgICAgICAgICAgICAg
IG1UZXhDb29yZHMucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgbU91dHN0YW5kaW5nR2x5
cGhzVmVydGljZXNQaXBlbGluZSA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0K
ICAgICAgICB9CgoJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgICBHTDIgZ2wg
PSBHTENvbnRleHQuZ2V0Q3VycmVudEdMKCkuZ2V0R0wyKCk7CiAgICAgICAgICAgICBpbnRbXSB2
Ym9zID0gbmV3IGludFsyXTsKICAgICAgICAgICAgIHZib3NbMF0gPSBtVkJPX0Zvcl9SZXN1YWJs
ZVRpbGVWZXJ0aWNlczsKICAgICAgICAgICAgIHZib3NbMV0gPSBtVkJPX0Zvcl9SZXN1YWJsZVRp
bGVUZXhDb29yZHM7CiAgICAgICAgICAgICBnbC5nbERlbGV0ZUJ1ZmZlcnMoMiwgSW50QnVmZmVy
LndyYXAodmJvcykpOwoJCX0KICAgIH0KCiAgICBjbGFzcyBEZWJ1Z0xpc3RlbmVyIGltcGxlbWVu
dHMgR0xFdmVudExpc3RlbmVyIHsKICAgICAgICBwcml2YXRlIEdMVSBnbHU7CiAgICAgICAgcHJp
dmF0ZSBGcmFtZSBmcmFtZTsKCiAgICAgICAgRGVidWdMaXN0ZW5lcihHTCBnbCwgRnJhbWUgZnJh
bWUpIHsKICAgICAgICAgICAgdGhpcy5nbHUgPSBHTFUuY3JlYXRlR0xVKGdsKTsKICAgICAgICAg
ICAgdGhpcy5mcmFtZSA9IGZyYW1lOwogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAg
ICAgcHVibGljIHZvaWQgZGlzcGxheShHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSkgewogICAgICAg
ICAgICBHTDIgZ2wgPSBHTENvbnRleHQuZ2V0Q3VycmVudEdMKCkuZ2V0R0wyKCk7CiAgICAgICAg
ICAgIGdsLmdsQ2xlYXIoR0wyLkdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTDIuR0xfQ09MT1JfQlVG
RkVSX0JJVCk7CgogICAgICAgICAgICBpZiAocGFja2VyID09IG51bGwpIHsKICAgICAgICAgICAg
ICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGV4dHVyZVJlbmRlcmVyIHJl
bmQgPSBnZXRCYWNraW5nU3RvcmUoKTsKICAgICAgICAgICAgZmluYWwgaW50IHcgPSByZW5kLmdl
dFdpZHRoKCk7CiAgICAgICAgICAgIGZpbmFsIGludCBoID0gcmVuZC5nZXRIZWlnaHQoKTsKICAg
ICAgICAgICAgcmVuZC5iZWdpbk9ydGhvUmVuZGVyaW5nKHcsIGgpOwogICAgICAgICAgICByZW5k
LmRyYXdPcnRob1JlY3QoMCwgMCk7CiAgICAgICAgICAgIHJlbmQuZW5kT3J0aG9SZW5kZXJpbmco
KTsKCiAgICAgICAgICAgIGlmICgoZnJhbWUuZ2V0V2lkdGgoKSAhPSB3KSB8fCAoZnJhbWUuZ2V0
SGVpZ2h0KCkgIT0gaCkpIHsKICAgICAgICAgICAgICAgIEV2ZW50UXVldWUuaW52b2tlTGF0ZXIo
bmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAg
ICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZnJhbWUuc2V0U2l6ZSh3LCBoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQog
ICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBA
T3ZlcnJpZGUKICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKEdMQXV0b0RyYXdhYmxlIGRyYXdh
YmxlKSB7CiAgICAgICAgCW1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZGlzcG9zZSgpOwogICAgICAg
ICAgICBnbHUuZGVzdHJveSgpOwogICAgICAgICAgICBnbHU9bnVsbDsKICAgICAgICAgICAgZnJh
bWU9bnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIFVudXNlZCBtZXRob2RzCiAgICAgICAgQE92
ZXJyaWRlCiAgICAgICAgcHVibGljIHZvaWQgaW5pdChHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSkg
ewogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIHZvaWQgcmVzaGFw
ZShHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CiAgICAgICAgfQoKICAgICAgICBw
dWJsaWMgdm9pZCBkaXNwbGF5Q2hhbmdlZChHTEF1dG9EcmF3YWJsZSBkcmF3YWJsZSwKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1vZGVDaGFuZ2VkLCBib29sZWFu
IGRldmljZUNoYW5nZWQpIHsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHdo
ZXRoZXIgdmVydGV4IGFycmF5cyBhcmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5IGZvcgogICAgICog
cmVuZGVyaW5nLCBvciB3aGV0aGVyIHRleHQgaXMgcmVuZGVyZWQgdXNpbmcgdGhlIE9wZW5HTAog
ICAgICogaW1tZWRpYXRlIG1vZGUgY29tbWFuZHMuIFRoaXMgaXMgcHJvdmlkZWQgYXMgYSBjb25j
ZXNzaW9uIGZvcgogICAgICogY2VydGFpbiBncmFwaGljcyBjYXJkcyB3aGljaCBoYXZlIHBvb3Ig
dmVydGV4IGFycmF5CiAgICAgKiBwZXJmb3JtYW5jZS4gRGVmYXVsdHMgdG8gdHJ1ZS4KICAgICAq
LwogICAgcHVibGljIHZvaWQgc2V0VXNlVmVydGV4QXJyYXlzKGJvb2xlYW4gdXNlVmVydGV4QXJy
YXlzKSB7CiAgICAgICAgdGhpcy51c2VWZXJ0ZXhBcnJheXMgPSB1c2VWZXJ0ZXhBcnJheXM7CiAg
ICB9CgogICAgLyoqCiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB2ZXJ0ZXggYXJyYXlzIGFyZSBi
ZWluZyB1c2VkIGludGVybmFsbHkgZm9yCiAgICAgKiByZW5kZXJpbmcsIG9yIHdoZXRoZXIgdGV4
dCBpcyByZW5kZXJlZCB1c2luZyB0aGUgT3BlbkdMCiAgICAgKiBpbW1lZGlhdGUgbW9kZSBjb21t
YW5kcy4gRGVmYXVsdHMgdG8gdHJ1ZS4KICAgICAqLwogICAgcHVibGljIGZpbmFsIGJvb2xlYW4g
Z2V0VXNlVmVydGV4QXJyYXlzKCkgewogICAgICAgIHJldHVybiB1c2VWZXJ0ZXhBcnJheXM7CiAg
ICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHdoZXRoZXIgc21vb3RoaW5nIChpLmUuLCBHTF9MSU5F
QVIgZmlsdGVyaW5nKSBpcyBlbmFibGVkCiAgICAgKiBpbiB0aGUgYmFja2luZyBUZXh0dXJlUmVu
ZGVyZXIgb2YgdGhpcyBUZXh0UmVuZGVyZXIuIEEgZmV3CiAgICAgKiBncmFwaGljcyBjYXJkcyBk
byBub3QgYmVoYXZlIHdlbGwgd2hlbiB0aGlzIGlzIGVuYWJsZWQsCiAgICAgKiByZXN1bHRpbmcg
aW4gZnV6enkgdGV4dC4gRGVmYXVsdHMgdG8gdHJ1ZS4KICAgICAqLwogICAgcHVibGljIHZvaWQg
c2V0U21vb3RoaW5nKGJvb2xlYW4gc21vb3RoaW5nKSB7CiAgICAgICAgdGhpcy5zbW9vdGhpbmcg
PSBzbW9vdGhpbmc7CiAgICAgICAgZ2V0QmFja2luZ1N0b3JlKCkuc2V0U21vb3RoaW5nKHNtb290
aGluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBzbW9vdGhpbmcg
aXMgZW5hYmxlZCBpbiB0aGUgYmFja2luZwogICAgICogVGV4dHVyZVJlbmRlcmVyIG9mIHRoaXMg
VGV4dFJlbmRlcmVyLiBBIGZldyBncmFwaGljcyBjYXJkcyBkbwogICAgICogbm90IGJlaGF2ZSB3
ZWxsIHdoZW4gdGhpcyBpcyBlbmFibGVkLCByZXN1bHRpbmcgaW4gZnV6enkgdGV4dC4KICAgICAq
IERlZmF1bHRzIHRvIHRydWUuCiAgICAgKi8KICAgIHB1YmxpYyBib29sZWFuIGdldFNtb290aGlu
ZygpIHsKICAgICAgICByZXR1cm4gc21vb3RoaW5nOwogICAgfQoKICAgIHByaXZhdGUgZmluYWwg
Ym9vbGVhbiBpczE1QXZhaWxhYmxlKEdMIGdsKSB7CiAgICAgICAgaWYgKCFjaGVja0Zvcl9pc0V4
dGVuc2lvbkF2YWlsYWJsZV9HTF9WRVJTSU9OXzFfNSkgewogICAgICAgICAgICBpc0V4dGVuc2lv
bkF2YWlsYWJsZV9HTF9WRVJTSU9OXzFfNSA9IGdsLmlzRXh0ZW5zaW9uQXZhaWxhYmxlKEdMRXh0
ZW5zaW9ucy5WRVJTSU9OXzFfNSk7CiAgICAgICAgICAgIGNoZWNrRm9yX2lzRXh0ZW5zaW9uQXZh
aWxhYmxlX0dMX1ZFUlNJT05fMV81ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlz
RXh0ZW5zaW9uQXZhaWxhYmxlX0dMX1ZFUlNJT05fMV81OwogICAgfQp9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>819</attachid>
            <date>2019-08-20 18:48:24 +0200</date>
            <delta_ts>2019-08-20 18:48:24 +0200</delta_ts>
            <desc>Cleaned up Patch from original proposal</desc>
            <filename>Bug1101-TextRenderer.diff</filename>
            <type>text/plain</type>
            <size>2549</size>
            <attacher name="Sven Gothel">sgothel</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL3NyYy9qb2dsL2NsYXNzZXMvY29tL2pvZ2FtcC9vcGVuZ2wvdXRpbC9hd3Qv
VGV4dFJlbmRlcmVyLmphdmEgYi9zcmMvam9nbC9jbGFzc2VzL2NvbS9qb2dhbXAvb3BlbmdsL3V0
aWwvYXd0L1RleHRSZW5kZXJlci5qYXZhCmluZGV4IDM4YmFjMDZjYy4uMGZjMzZhMjQ5IDEwMDY0
NAotLS0gYS9zcmMvam9nbC9jbGFzc2VzL2NvbS9qb2dhbXAvb3BlbmdsL3V0aWwvYXd0L1RleHRS
ZW5kZXJlci5qYXZhCisrKyBiL3NyYy9qb2dsL2NsYXNzZXMvY29tL2pvZ2FtcC9vcGVuZ2wvdXRp
bC9hd3QvVGV4dFJlbmRlcmVyLmphdmEKQEAgLTQyLDcgKzQyLDYgQEAgcGFja2FnZSBjb20uam9n
YW1wLm9wZW5nbC51dGlsLmF3dDsKIGltcG9ydCBjb20uam9nYW1wLmNvbW1vbi5uaW8uQnVmZmVy
czsKIGltcG9ydCBjb20uam9nYW1wLmNvbW1vbi51dGlsLkludGVycnVwdFNvdXJjZTsKIGltcG9y
dCBjb20uam9nYW1wLmNvbW1vbi51dGlsLlByb3BlcnR5QWNjZXNzOwotaW1wb3J0IGNvbS5qb2dh
bXAub3BlbmdsLkdMRXh0ZW5zaW9uczsKIGltcG9ydCBjb20uam9nYW1wLm9wZW5nbC51dGlsLio7
CiBpbXBvcnQgY29tLmpvZ2FtcC5vcGVuZ2wudXRpbC5wYWNrcmVjdC4qOwogaW1wb3J0IGNvbS5q
b2dhbXAub3BlbmdsLnV0aWwudGV4dHVyZS4qOwpAQCAtNTY2LDYgKzU2NSw5IEBAIHB1YmxpYyBj
bGFzcyBUZXh0UmVuZGVyZXIgewogICAgICAgICBAdGhyb3dzIEdMRXhjZXB0aW9uIElmIGFuIE9w
ZW5HTCBjb250ZXh0IGlzIG5vdCBjdXJyZW50IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCiAg
ICAgKi8KICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgdGhyb3dzIEdMRXhjZXB0aW9uIHsKKyAg
ICAgICAgaWYoIG51bGwgIT0gbVBpcGVsaW5lZFF1YWRSZW5kZXJlciApIHsKKyAgICAgICAgICAg
IG1QaXBlbGluZWRRdWFkUmVuZGVyZXIuZGlzcG9zZSgpOworICAgICAgICB9CiAgICAgICAgIHBh
Y2tlci5kaXNwb3NlKCk7CiAgICAgICAgIHBhY2tlciA9IG51bGw7CiAgICAgICAgIGNhY2hlZEJh
Y2tpbmdTdG9yZSA9IG51bGw7CkBAIC0xODYyLDcgKzE4NjQsNyBAQCBwdWJsaWMgY2xhc3MgVGV4
dFJlbmRlcmVyIHsKICAgICAgICAgICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZFBvaW50ZXIoMiwg
R0wuR0xfRkxPQVQsIDAsIG1UZXhDb29yZHMpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAg
ICAgICAgICAgIGdsLmdsRHJhd0FycmF5cyhHTDJHTDMuR0xfUVVBRFMsIDAsCisgICAgICAgICAg
ICAgICAgZ2wuZ2xEcmF3QXJyYXlzKEdMMkVTMy5HTF9RVUFEUywgMCwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbU91dHN0YW5kaW5nR2x5cGhzVmVydGljZXNQaXBlbGluZSk7CiAK
ICAgICAgICAgICAgICAgICBtVmVydENvb3Jkcy5yZXdpbmQoKTsKQEAgLTE4NzcsNyArMTg3OSw3
IEBAIHB1YmxpYyBjbGFzcyBUZXh0UmVuZGVyZXIgewogICAgICAgICAgICAgICAgIHJlbmRlcmVy
LmdldFRleHR1cmUoKTsgLy8gdHJpZ2dlcnMgdGV4dHVyZSB1cGxvYWRzLiAgTWF5YmUgdGhpcyBz
aG91bGQgYmUgbW9yZSBvYnZpb3VzPwogCiAgICAgICAgICAgICAgICAgZmluYWwgR0wyIGdsID0g
R0xDb250ZXh0LmdldEN1cnJlbnRHTCgpLmdldEdMMigpOwotICAgICAgICAgICAgICAgIGdsLmds
QmVnaW4oR0wyR0wzLkdMX1FVQURTKTsKKyAgICAgICAgICAgICAgICBnbC5nbEJlZ2luKEdMMkVT
My5HTF9RVUFEUyk7CiAKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAg
ICBmaW5hbCBpbnQgbnVtYmVyT2ZRdWFkcyA9IG1PdXRzdGFuZGluZ0dseXBoc1ZlcnRpY2VzUGlw
ZWxpbmUgLyA0OwpAQCAtMTkxMSw2ICsxOTEzLDE0IEBAIHB1YmxpYyBjbGFzcyBUZXh0UmVuZGVy
ZXIgewogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisJCXB1
YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCSAgICBmaW5hbCBHTDIgZ2wgPSBHTENvbnRleHQuZ2V0
Q3VycmVudEdMKCkuZ2V0R0wyKCk7CisJCSAgICBmaW5hbCBpbnRbXSB2Ym9zID0gbmV3IGludFsy
XTsKKwkJICAgIHZib3NbMF0gPSBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVWZXJ0aWNlczsKKwkJICAg
IHZib3NbMV0gPSBtVkJPX0Zvcl9SZXN1YWJsZVRpbGVUZXhDb29yZHM7CisJCSAgICBnbC5nbERl
bGV0ZUJ1ZmZlcnMoMiwgSW50QnVmZmVyLndyYXAodmJvcykpOworCQl9CiAgICAgfQogCiAgICAg
Y2xhc3MgRGVidWdMaXN0ZW5lciBpbXBsZW1lbnRzIEdMRXZlbnRMaXN0ZW5lciB7CkBAIC0xOTUw
LDYgKzE5NjAsOCBAQCBwdWJsaWMgY2xhc3MgVGV4dFJlbmRlcmVyIHsKIAogICAgICAgICBAT3Zl
cnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShmaW5hbCBHTEF1dG9EcmF3YWJsZSBk
cmF3YWJsZSkgeworICAgICAgICAgICAgbVBpcGVsaW5lZFF1YWRSZW5kZXJlci5kaXNwb3NlKCk7
CisgICAgICAgICAgICAvLyBuL2EgZ2x1LmRlc3Ryb3koKTsgPz8KICAgICAgICAgICAgIGdsdT1u
dWxsOwogICAgICAgICAgICAgZnJhbWU9bnVsbDsKICAgICAgICAgfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>