AdviseConstructorTransformer
Jonas Bonér <[email protected]> Fri, 02 May 2003 16:35:09 +0200
| Newsgroups | gmane.comp.java.aspectwerkz |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format.
--------------000602030005030808020106
Content-Type: text/plain; charset=GB2312
Content-Transfer-Encoding: 8bit
Hi Shiyiying.
It would be really great if you wanted to help me out writing a
AdviseConstructorTransformer class.
Thanks for dedicating your time :-)
Regarding the the issue about the constructors you are mentioning:
it is a bug and I have fixed it (but not committed yet).
I have been rewriting some of the the base to support a more
fine-grained selection language for the pointcut selections. So I
thought that I should wait with this patch (among others) until I am
done with this (within a week). But I'm attaching the code for the new
AdviseMemberMethodTransformer class so you have something to start with :-).
Thanks, once again, and don't hesitate bothering me with questions.
Sincerely, Jonas.
é æ¶â¬å¦ wrote:
> Hi Jonas:
> We now take a holiday in China.So I decide to write a
> AdviseConstructorTransformer for aspectwerk.
> When I'm looking into the source code of AdviseMemberMethodTransformer,
> I found every time AdviseMemberMethodTransformer create a new
> JoinPointField ,it just add this JoinPointField to first constructor:
>
> addJoinPointField(cpg, cg, mg, methodSequence,
> isThreadSafe);
>
> methods[idxInit] = createJoinPointField(
> cpg, cg,
> methods[idxInit],
> methods[i],
> factory,
> methodLookupId,
> methodSequence,
> isThreadSafe).getMethod();
>
>
> So I suspect If I have two or more Constructor in one class, Code use
> second constructor will throw a NullPointerException(because
> joinPointField was not added to all constructors).
>
> package examples.logging;
>
> /**
> *
> */
> public class Target {
>
> public Target() {
> }
> public Target(String name) {
> }
> /**
> * @attributes:method log
> */
> public void toLog1() {
> System.out.println("\tinvoking toLog1");
> }
>
> /**
> * @attributes:method log
> */
> public void toLog2(java.lang.String arg) {
> System.out.println("\tinvoking toLog2");
> }
>
> /**
> * @attributes:method log
> */
> public String toLog3() {
> System.out.println("\tinvoking toLog3");
> return "result";
> }
>
> public static void main(String[] args) {
> Target target = new Target("dummy");
> target.toLog1();
> target.toLog2("parameter");
> target.toLog3();
> }
> }
> So I change logging sample code to test it.
> I add a new Constructor Target(String name)to it,and use this new
> constructor in main method,here is the result.
> [exec] parsing source files...
> [exec] meta-data for classes in
> C:\eclipse\workspace\aspectwerkz/src/samples
> have been generated to C:\eclipse\workspace\aspectwerkz/_metaData
>
> [exec] java.lang.NullPointerException
> [exec] at examples.logging.Target.toLog1(Target.java)
> [exec] at examples.logging.Target.main(Target.java:37)
> [exec] Exception in thread "main"
> Do I miss something? or Is it a bug?
>
> Best Regards
> Shiyiying
>
> _________________________________________________________________
> Ãâ·ÑÏÂÔØ MSN Explorer: http://explorer.msn.com/lccn/
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> aspectwerkz-developer mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/aspectwerkz-developer
>
>
--
Jonas
http://freeroller.net/page/jboner
--------------000602030005030808020106
Content-Type: text/plain;
name="AdviseMemberMethodTransformer.java"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="AdviseMemberMethodTransformer.java"
LyoNCiAqIEFzcGVjdFdlcmt6IEFPUCBGcmFtZXdvcmsuDQogKg0KICogRGlzdHJpYnV0YWJs
ZSB1bmRlciBMR1BMIGxpY2Vuc2UuDQogKiBTZWUgdGVybXMgb2YgbGljZW5zZSBhdCBnbnUu
b3JnLg0KICovDQpwYWNrYWdlIGFzcGVjdHdlcmt6LnRyYW5zZm9ybTsNCg0KaW1wb3J0IGph
dmEudXRpbC5NYXA7DQppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQppbXBvcnQgamF2YS51
dGlsLkxpc3Q7DQppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCmltcG9ydCBqYXZhLnV0
aWwuSXRlcmF0b3I7DQppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KDQppbXBvcnQg
b3JnLmFwYWNoZS5iY2VsLmdlbmVyaWMuSW5zdHJ1Y3Rpb25GYWN0b3J5Ow0KaW1wb3J0IG9y
Zy5hcGFjaGUuYmNlbC5nZW5lcmljLkNvbnN0YW50UG9vbEdlbjsNCmltcG9ydCBvcmcuYXBh
Y2hlLmJjZWwuZ2VuZXJpYy5DbGFzc0dlbjsNCmltcG9ydCBvcmcuYXBhY2hlLmJjZWwuZ2Vu
ZXJpYy5UeXBlOw0KaW1wb3J0IG9yZy5hcGFjaGUuYmNlbC5nZW5lcmljLkluc3RydWN0aW9u
TGlzdDsNCmltcG9ydCBvcmcuYXBhY2hlLmJjZWwuZ2VuZXJpYy5NZXRob2RHZW47DQppbXBv
cnQgb3JnLmFwYWNoZS5iY2VsLmdlbmVyaWMuQmFzaWNUeXBlOw0KaW1wb3J0IG9yZy5hcGFj
aGUuYmNlbC5nZW5lcmljLlBVU0g7DQppbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmdlbmVyaWMu
SW5zdHJ1Y3Rpb25Db25zdGFudHM7DQppbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmdlbmVyaWMu
Q1BJbnN0cnVjdGlvbjsNCmltcG9ydCBvcmcuYXBhY2hlLmJjZWwuZ2VuZXJpYy5PYmplY3RU
eXBlOw0KaW1wb3J0IG9yZy5hcGFjaGUuYmNlbC5nZW5lcmljLkFycmF5VHlwZTsNCmltcG9y
dCBvcmcuYXBhY2hlLmJjZWwuZ2VuZXJpYy5GaWVsZEdlbjsNCmltcG9ydCBvcmcuYXBhY2hl
LmJjZWwuZ2VuZXJpYy5JbnN0cnVjdGlvbkhhbmRsZTsNCmltcG9ydCBvcmcuYXBhY2hlLmJj
ZWwuZ2VuZXJpYy5SZXR1cm5JbnN0cnVjdGlvbjsNCmltcG9ydCBvcmcuYXBhY2hlLmJjZWwu
Z2VuZXJpYy5Db2RlRXhjZXB0aW9uR2VuOw0KaW1wb3J0IG9yZy5hcGFjaGUuYmNlbC5nZW5l
cmljLkJyYW5jaEluc3RydWN0aW9uOw0KaW1wb3J0IG9yZy5hcGFjaGUuYmNlbC5Db25zdGFu
dHM7DQppbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5NZXRob2Q7DQoNCmltcG9y
dCBvcmcuY3MzLmptYW5nbGVyLmJjZWx0cmFuc2Zvcm1lci5VbmV4dGVuZGFibGVDbGFzc1Nl
dDsNCmltcG9ydCBvcmcuY3MzLmptYW5nbGVyLmJjZWx0cmFuc2Zvcm1lci5Db2RlVHJhbnNm
b3JtZXJDb21wb25lbnQ7DQoNCmltcG9ydCBhc3BlY3R3ZXJrei5kZWZpbml0aW9uLm1ldGFk
YXRhLldlYXZlTW9kZWw7DQppbXBvcnQgYXNwZWN0d2Vya3ouZGVmaW5pdGlvbi5tZXRhZGF0
YS5NZXRob2RNZXRhRGF0YTsNCg0KLyoqDQogKiBUcmFuc2Zvcm1zIG1lbWJlciBtZXRob2Rz
IHRvIGJlY29tZSAiYXNwZWN0LWF3YXJlIi4NCiAqDQogKiBAYXV0aG9yIDxhIGhyZWY9Im1h
aWx0bzpqYm9uZXJAYWNtLm9yZyI+Sm9uYXMgQm9u6XI8L2E+DQogKiBAdmVyc2lvbiAkSWQ6
IEFkdmlzZU1lbWJlck1ldGhvZFRyYW5zZm9ybWVyLmphdmEsdiAxLjQgMjAwMy8wNC8xNiAx
NToyNTowNiBqYm9uZXIgRXhwICQNCiAqLw0KcHVibGljIGNsYXNzIEFkdmlzZU1lbWJlck1l
dGhvZFRyYW5zZm9ybWVyIGltcGxlbWVudHMgQ29kZVRyYW5zZm9ybWVyQ29tcG9uZW50IHsN
CiAgICAvLy9DTE9WRVI6T0ZGDQoNCiAgICAvKioNCiAgICAgKiBIb2xkcyB0aGUgd2VhdmUg
bW9kZWwuDQogICAgICovDQogICAgcHJpdmF0ZSBXZWF2ZU1vZGVsIG1fd2VhdmVNb2RlbCA9
IFdlYXZlTW9kZWwubG9hZE1vZGVsKCk7DQoNCiAgICAvKioNCiAgICAgKiBDb25zdHJ1Y3Rv
ci4NCiAgICAgKi8NCiAgICBwdWJsaWMgQWR2aXNlTWVtYmVyTWV0aG9kVHJhbnNmb3JtZXIo
KSB7DQogICAgICAgIHN1cGVyKCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogTWFrZXMg
dGhlIG1lbWJlciBtZXRob2QgdHJhbnNmb3JtYXRpb25zLg0KICAgICAqDQogICAgICogQHBh
cmFtIGNzIHRoZSBjbGFzcyBzZXQuDQogICAgICovDQogICAgcHVibGljIHZvaWQgdHJhbnNm
b3JtQ29kZShmaW5hbCBVbmV4dGVuZGFibGVDbGFzc1NldCBjcykgew0KICAgICAgICBmaW5h
bCBJdGVyYXRvciBpdGVyYXRvciA9IGNzLmdldEl0ZXJhdG9yRm9yVHJhbnNmb3JtYWJsZUNs
YXNzZXMoKTsNCiAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgew0KICAgICAg
ICAgICAgZmluYWwgQ2xhc3NHZW4gY2cgPSAoQ2xhc3NHZW4paXRlcmF0b3IubmV4dCgpOw0K
DQogICAgICAgICAgICBpZiAoY2xhc3NGaWx0ZXIoY2cpKSBjb250aW51ZTsNCg0KICAgICAg
ICAgICAgZmluYWwgSW5zdHJ1Y3Rpb25GYWN0b3J5IGZhY3RvcnkgPSBuZXcgSW5zdHJ1Y3Rp
b25GYWN0b3J5KGNnKTsNCiAgICAgICAgICAgIGZpbmFsIENvbnN0YW50UG9vbEdlbiBjcGcg
PSBjZy5nZXRDb25zdGFudFBvb2woKTsNCiAgICAgICAgICAgIGZpbmFsIE1ldGhvZFtdIG1l
dGhvZHMgPSBjZy5nZXRNZXRob2RzKCk7DQoNCg0KICAgICAgICAgICAgLy8gZ2V0IHRoZSBp
bmRleGVzIGZvciB0aGUgPGluaXQ+IG1ldGhvZHMNCiAgICAgICAgICAgIExpc3QgaW5pdElu
ZGV4ZXMgPSBuZXcgQXJyYXlMaXN0KCk7DQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsg
aSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAobWV0aG9k
c1tpXS5nZXROYW1lKCkuZXF1YWxzKCI8aW5pdD4iKSkgew0KICAgICAgICAgICAgICAgICAg
ICBpbml0SW5kZXhlcy5hZGQobmV3IEludGVnZXIoaSkpOw0KICAgICAgICAgICAgICAgIH0N
CiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChpbml0SW5kZXhlcy5zaXplKCkgPT0g
MCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNsYXNzIGNvcnJ1cHQ6IG5vIDxpbml0
PiBtZXRob2QgZm91bmQgaW4gY2xhc3MgIiArIGNnLmdldENsYXNzTmFtZSgpKTsNCg0KICAg
ICAgICAgICAgLy8gYnVpbGQgYW5kIHNvcnQgdGhlIG1ldGhvZCBsb29rdXAgbGlzdA0KICAg
ICAgICAgICAgZmluYWwgTGlzdCBtZXRob2RMb29rdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgp
Ow0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsr
KSB7DQogICAgICAgICAgICAgICAgaWYgKG1ldGhvZEZpbHRlcihjZywgbWV0aG9kc1tpXSkp
IGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIG1ldGhvZExvb2t1cExpc3QuYWRkKG1ldGhv
ZHNbaV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydCht
ZXRob2RMb29rdXBMaXN0LCBCQ0VMTWV0aG9kQ29tcGFyYXRvci5nZXRJbnN0YW5jZSgpKTsN
Cg0KICAgICAgICAgICAgZmluYWwgTWFwIG1ldGhvZFNlcXVlbmNlcyA9IG5ldyBIYXNoTWFw
KCk7DQogICAgICAgICAgICBmaW5hbCBMaXN0IHByb3h5TWV0aG9kcyA9IG5ldyBBcnJheUxp
c3QoKTsNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7
IGkrKykgew0KDQogICAgICAgICAgICAgICAgaWYgKG1ldGhvZEZpbHRlcihjZywgbWV0aG9k
c1tpXSkgfHwgbWV0aG9kc1tpXS5pc1N0YXRpYygpKSBjb250aW51ZTsNCg0KICAgICAgICAg
ICAgICAgIGZpbmFsIE1ldGhvZEdlbiBtZyA9IG5ldyBNZXRob2RHZW4obWV0aG9kc1tpXSwg
Y2cuZ2V0Q2xhc3NOYW1lKCksIGNwZyk7DQoNCiAgICAgICAgICAgICAgICAvLyB0YWtlIGNh
cmUgb2YgaWRlbnRpZmljYXRpb24gb2Ygb3ZlcmxvYWRlZCBtZXRob2RzIGJ5IGluc2VydGlu
ZyBhIHNlcXVlbmNlIG51bWJlcg0KICAgICAgICAgICAgICAgIGlmIChtZXRob2RTZXF1ZW5j
ZXMuY29udGFpbnNLZXkobWV0aG9kc1tpXS5nZXROYW1lKCkpKSB7DQogICAgICAgICAgICAg
ICAgICAgIGludCBzZXF1ZW5jZSA9ICgoSW50ZWdlciltZXRob2RTZXF1ZW5jZXMuZ2V0KG1l
dGhvZHNbaV0uZ2V0TmFtZSgpKSkuaW50VmFsdWUoKTsNCiAgICAgICAgICAgICAgICAgICAg
bWV0aG9kU2VxdWVuY2VzLnJlbW92ZShtZXRob2RzW2ldLmdldE5hbWUoKSk7DQogICAgICAg
ICAgICAgICAgICAgIHNlcXVlbmNlKys7DQogICAgICAgICAgICAgICAgICAgIG1ldGhvZFNl
cXVlbmNlcy5wdXQobWV0aG9kc1tpXS5nZXROYW1lKCksIG5ldyBJbnRlZ2VyKHNlcXVlbmNl
KSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAg
ICAgICAgICAgICAgICBtZXRob2RTZXF1ZW5jZXMucHV0KG1ldGhvZHNbaV0uZ2V0TmFtZSgp
LCBuZXcgSW50ZWdlcigxKSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAg
ICAgZmluYWwgaW50IG1ldGhvZExvb2t1cElkID0gbWV0aG9kTG9va3VwTGlzdC5pbmRleE9m
KG1ldGhvZHNbaV0pOw0KICAgICAgICAgICAgICAgIGZpbmFsIGludCBtZXRob2RTZXF1ZW5j
ZSA9ICgoSW50ZWdlciltZXRob2RTZXF1ZW5jZXMuZ2V0KG1ldGhvZHNbaV0uZ2V0TmFtZSgp
KSkuaW50VmFsdWUoKTsNCg0KICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBwb2lu
dGN1dCBzaG91bGQgYmUgZGVwbG95ZWQgYXMgdGhyZWFkIHNhZmUgb3Igbm90DQogICAgICAg
ICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1RocmVhZFNhZmUgPSB0cnVlOyAvLyBpc1RocmVh
ZFNhZmUoY2csIG1ldGhvZHNbaV0pOw0KDQogICAgICAgICAgICAgICAgYWRkSm9pblBvaW50
RmllbGQoY3BnLCBjZywgbWcsIG1ldGhvZFNlcXVlbmNlLCBpc1RocmVhZFNhZmUpOw0KDQog
ICAgICAgICAgICAgICAgLy8gYWR2aXNlIGFsbCB0aGUgY29uc3RydWN0b3JzDQogICAgICAg
ICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGluaXRJbmRleGVzLml0ZXJhdG9yKCk7IGl0
Lmhhc05leHQoKTspIHsNCiAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluaXRJbmRl
eCA9ICgoSW50ZWdlcilpdC5uZXh0KCkpLmludFZhbHVlKCk7DQoNCiAgICAgICAgICAgICAg
ICAgICAgbWV0aG9kc1tpbml0SW5kZXhdID0gY3JlYXRlSm9pblBvaW50RmllbGQoDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY3BnLCBjZywNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtZXRob2RzW2luaXRJbmRleF0sDQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbWV0aG9kc1tpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LA0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZExvb2t1cElkLA0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1ldGhvZFNlcXVlbmNlLA0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlzVGhyZWFkU2FmZSkuZ2V0TWV0aG9kKCk7DQogICAgICAgICAgICAgICAg
fQ0KDQogICAgICAgICAgICAgICAgcHJveHlNZXRob2RzLmFkZChjcmVhdGVQcm94eU1ldGhv
ZCgNCiAgICAgICAgICAgICAgICAgICAgICAgIGNwZywgY2csIG1nLA0KICAgICAgICAgICAg
ICAgICAgICAgICAgZmFjdG9yeSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZExv
b2t1cElkLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kU2VxdWVuY2UsDQogICAg
ICAgICAgICAgICAgICAgICAgICBtZXRob2RzW2ldLmdldEFjY2Vzc0ZsYWdzKCksDQogICAg
ICAgICAgICAgICAgICAgICAgICBpc1RocmVhZFNhZmUpKTsNCg0KICAgICAgICAgICAgICAg
IG1ldGhvZHNbaV0gPSBhZGRQcmVmaXhUb01ldGhvZCgNCiAgICAgICAgICAgICAgICAgICAg
ICAgIGNwZywgY2csIG1nLA0KICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kc1tpXSwN
CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZFNlcXVlbmNlKS5nZXRNZXRob2QoKTsN
Cg0KICAgICAgICAgICAgICAgIG1nLnNldE1heFN0YWNrKCk7DQogICAgICAgICAgICB9DQoN
CiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb2xkIG1ldGhvZHMNCiAgICAgICAgICAgIGNn
LnNldE1ldGhvZHMobWV0aG9kcyk7DQoNCiAgICAgICAgICAgIC8vIGFkZCB0aGUgcHJveHkg
bWV0aG9kcw0KICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHByb3h5TWV0aG9kcy5p
dGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQogICAgICAgICAgICAgICAgTWV0aG9kIG1l
dGhvZCA9IChNZXRob2QpaXQubmV4dCgpOw0KICAgICAgICAgICAgICAgIGNnLmFkZE1ldGhv
ZChtZXRob2QpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoq
DQogICAgICogQWRkcyBhIGpvaW4gcG9pbnQgbWVtYmVyIGZpZWxkLg0KICAgICAqDQogICAg
ICogQHBhcmFtIGNwIHRoZSBDb25zdGFudFBvb2xHZW4NCiAgICAgKiBAcGFyYW0gY2cgdGhl
IENsYXNzR2VuDQogICAgICogQHBhcmFtIG1nIHRoZSBNZXRob2RHZW4NCiAgICAgKiBAcGFy
YW0gbWV0aG9kU2VxdWVuY2UgdGhlIG1ldGhvZHMgc2VxdWVuY2UgbnVtYmVyDQogICAgICov
DQogICAgcHJpdmF0ZSB2b2lkIGFkZEpvaW5Qb2ludEZpZWxkKGZpbmFsIENvbnN0YW50UG9v
bEdlbiBjcCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xh
c3NHZW4gY2csDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1l
dGhvZEdlbiBtZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwg
aW50IG1ldGhvZFNlcXVlbmNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmaW5hbCBib29sZWFuIGlzVGhyZWFkU2FmZSkgew0KDQogICAgICAgIGZpbmFsIFN0cmlu
Z0J1ZmZlciBqb2luUG9pbnQgPQ0KICAgICAgICAgICAgICAgIGdldEpvaW5Qb2ludE5hbWUo
bWcuZ2V0TWV0aG9kKCksIG1ldGhvZFNlcXVlbmNlKTsNCg0KICAgICAgICBmaW5hbCBGaWVs
ZEdlbiBmaWVsZDsNCiAgICAgICAgaWYgKGlzVGhyZWFkU2FmZSkgew0KICAgICAgICAgICAg
ZmllbGQgPSBuZXcgRmllbGRHZW4oDQogICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5B
Q0NfUFJJVkFURSB8IENvbnN0YW50cy5BQ0NfRklOQUwsDQogICAgICAgICAgICAgICAgICAg
IG5ldyBPYmplY3RUeXBlKCJqYXZhLmxhbmcuVGhyZWFkTG9jYWwiKSwNCiAgICAgICAgICAg
ICAgICAgICAgam9pblBvaW50LnRvU3RyaW5nKCksDQogICAgICAgICAgICAgICAgICAgIGNw
KTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGZpZWxkID0gbmV3
IEZpZWxkR2VuKA0KICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUNDX1BSSVZBVEUg
fCBDb25zdGFudHMuQUNDX0ZJTkFMLA0KICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1h
dGlvblV0aWwuTUVNQkVSX01FVEhPRF9KT0lOX1BPSU5UX1RZUEUsDQogICAgICAgICAgICAg
ICAgICAgIGpvaW5Qb2ludC50b1N0cmluZygpLA0KICAgICAgICAgICAgICAgICAgICBjcCk7
DQogICAgICAgIH0NCiAgICAgICAgY2cuYWRkRmllbGQoZmllbGQuZ2V0RmllbGQoKSk7DQog
ICAgfQ0KDQogICAgLyoqDQogICAgICogVHJhbnNmb3JtcyB0aGUgaW5pdCBtZXRob2QgdG8g
Y3JlYXRlIHRoZSBuZXdseSBhZGRlZCBqb2luIHBvaW50IG1lbWJlciBmaWVsZC4NCiAgICAg
Kg0KICAgICAqIEBwYXJhbSBjcCB0aGUgQ29uc3RhbnRQb29sR2VuDQogICAgICogQHBhcmFt
IGNnIHRoZSBDbGFzc0dlbg0KICAgICAqIEBwYXJhbSBpbml0IHRoZSBjb25zdHJ1Y3RvciBm
b3IgdGhlIGNsYXNzDQogICAgICogQHBhcmFtIG1ldGhvZCB0aGUgY3VycmVudCBtZXRob2QN
CiAgICAgKiBAcGFyYW0gZmFjdG9yeSB0aGUgb2JqZWN0ZmFjdG9yeQ0KICAgICAqIEBwYXJh
bSBtZXRob2RJZCB0aGUgaWQgb2YgdGhlIGN1cnJlbnQgbWV0aG9kIGluIHRoZSBsb29rdXAg
dGFibA0KICAgICAqIEBwYXJhbSBtZXRob2RTZXF1ZW5jZSB0aGUgbWV0aG9kcyBzZXF1ZW5j
ZSBudW1iZXINCiAgICAgKiBAcGFyYW0gaXNUaHJlYWRTYWZlDQogICAgICogQHJldHVybiB0
aGUgbW9kaWZpZWQgY29uc3RydWN0b3INCiAgICAgKi8NCiAgICBwcml2YXRlIE1ldGhvZEdl
biBjcmVhdGVKb2luUG9pbnRGaWVsZChmaW5hbCBDb25zdGFudFBvb2xHZW4gY3AsDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NHZW4g
Y2csDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwg
TWV0aG9kIGluaXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZmluYWwgTWV0aG9kIG1ldGhvZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmaW5hbCBJbnN0cnVjdGlvbkZhY3RvcnkgZmFjdG9yeSwNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbWV0aG9k
SWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwg
aW50IG1ldGhvZFNlcXVlbmNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNUaHJlYWRTYWZlKSB7DQoNCiAgICAgICAgZmlu
YWwgTWV0aG9kR2VuIG1nID0gbmV3IE1ldGhvZEdlbihpbml0LCBjZy5nZXRDbGFzc05hbWUo
KSwgY3ApOw0KICAgICAgICBmaW5hbCBJbnN0cnVjdGlvbkxpc3QgaWwgPSBtZy5nZXRJbnN0
cnVjdGlvbkxpc3QoKTsNCg0KICAgICAgICBmaW5hbCBJbnN0cnVjdGlvbkhhbmRsZVtdIGlo
cyA9IGlsLmdldEluc3RydWN0aW9uSGFuZGxlcygpOw0KICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IGlocy5sZW5ndGg7IGkrKykgew0KDQogICAgICAgICAgICAvLyBpbnNlcnRzIGZp
ZWxkIGluc3RhbnRpYXRpb24gaW50byB0aGUgY29uc3RydWN0b3INCiAgICAgICAgICAgIGZp
bmFsIEluc3RydWN0aW9uSGFuZGxlIGloID0gaWhzW2ldOw0KICAgICAgICAgICAgaWYgKCEo
aWguZ2V0SW5zdHJ1Y3Rpb24oKSBpbnN0YW5jZW9mIFJldHVybkluc3RydWN0aW9uKSkgY29u
dGludWU7DQoNCiAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBqb2luUG9pbnQgPSBn
ZXRKb2luUG9pbnROYW1lKG1ldGhvZCwgbWV0aG9kU2VxdWVuY2UpOw0KDQogICAgICAgICAg
ICBmaW5hbCBJbnN0cnVjdGlvbkhhbmRsZSBpaFBvc3Q7DQogICAgICAgICAgICBpZiAoaXNU
aHJlYWRTYWZlKSB7DQogICAgICAgICAgICAgICAgaWhQb3N0ID0gaWwuaW5zZXJ0KGloLCBm
YWN0b3J5LmNyZWF0ZUxvYWQoVHlwZS5PQkpFQ1QsIDApKTsNCiAgICAgICAgICAgICAgICBp
bC5pbnNlcnQoaWgsIGZhY3RvcnkuY3JlYXRlTmV3KCJqYXZhLmxhbmcuVGhyZWFkTG9jYWwi
KSk7DQoNCiAgICAgICAgICAgICAgICBpbC5pbnNlcnQoaWgsIEluc3RydWN0aW9uQ29uc3Rh
bnRzLkRVUCk7DQoNCiAgICAgICAgICAgICAgICBpbC5pbnNlcnQoaWgsIGZhY3RvcnkuY3Jl
YXRlSW52b2tlKA0KICAgICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5UaHJlYWRM
b2NhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAiPGluaXQ+IiwNCiAgICAgICAgICAg
ICAgICAgICAgICAgIFR5cGUuVk9JRCwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBU
eXBlW117fSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5JTlZPS0VTUEVD
SUFMKSk7DQoNCiAgICAgICAgICAgICAgICBpbC5pbnNlcnQoaWgsIGZhY3RvcnkuY3JlYXRl
RmllbGRBY2Nlc3MoDQogICAgICAgICAgICAgICAgICAgICAgICBjZy5nZXRDbGFzc05hbWUo
KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Qb2ludC50b1N0cmluZygpLA0KICAg
ICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFR5cGUoImphdmEubGFuZy5UaHJlYWRM
b2NhbCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlBVVEZJRUxEKSk7
DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAv
LyBjcmVhdGUgYW4gbmV3IGpvaW4gcG9pbnQNCiAgICAgICAgICAgICAgICBpaFBvc3QgPSBp
bC5pbnNlcnQoaWgsIGZhY3RvcnkuY3JlYXRlTG9hZChUeXBlLk9CSkVDVCwgMCkpOw0KICAg
ICAgICAgICAgICAgIGlsLmluc2VydChpaCwgZmFjdG9yeS5jcmVhdGVOZXcoDQogICAgICAg
ICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1hdGlvblV0aWwuTUVNQkVSX01FVEhPRF9KT0lO
X1BPSU5UX0NMQVNTKSk7DQoNCiAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBwYXJhbWV0
ZXJzICh0aGlzLCBtZXRob2RJZCBhbmQgdGhlIG1ldGhvZCBzaWduYXR1cmUpDQogICAgICAg
ICAgICAgICAgaWwuaW5zZXJ0KGloLCBJbnN0cnVjdGlvbkNvbnN0YW50cy5EVVApOw0KICAg
ICAgICAgICAgICAgIGlsLmluc2VydChpaCwgZmFjdG9yeS5jcmVhdGVMb2FkKFR5cGUuT0JK
RUNULCAwKSk7DQoNCiAgICAgICAgICAgICAgICBpbC5pbnNlcnQoaWgsIG5ldyBQVVNIKGNw
LCBtZXRob2RJZCkpOw0KDQogICAgICAgICAgICAgICAgLy8gaW52b2tlcyB0aGUgY29uc3Ry
dWN0b3INCiAgICAgICAgICAgICAgICBpbC5pbnNlcnQoaWgsIGZhY3RvcnkuY3JlYXRlSW52
b2tlKA0KICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtYXRpb25VdGlsLk1FTUJF
Ul9NRVRIT0RfSk9JTl9QT0lOVF9DTEFTUywNCiAgICAgICAgICAgICAgICAgICAgICAgICI8
aW5pdD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgVHlwZS5WT0lELA0KICAgICAgICAg
ICAgICAgICAgICAgICAgbmV3IFR5cGVbXXtUeXBlLk9CSkVDVCwgVHlwZS5JTlR9LA0KICAg
ICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLklOVk9LRVNQRUNJQUwpKTsNCg0KICAg
ICAgICAgICAgICAgIC8vIHNldCB0aGUgam9pbiBwb2ludCB0byB0aGUgbWVtYmVyIGZpZWxk
IHNwZWNpZmllZA0KICAgICAgICAgICAgICAgIGlsLmluc2VydChpaCwgZmFjdG9yeS5jcmVh
dGVGaWVsZEFjY2VzcygNCiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmdldENsYXNzTmFt
ZSgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgam9pblBvaW50LnRvU3RyaW5nKCksDQog
ICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1hdGlvblV0aWwuTUVNQkVSX01FVEhP
RF9KT0lOX1BPSU5UX1RZUEUsDQogICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMu
UFVURklFTEQpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlsLnJlZGlyZWN0QnJh
bmNoZXMoaWgsIGloUG9zdCk7DQogICAgICAgIH0NCiAgICAgICAgbWcuc2V0TWF4U3RhY2so
KTsNCiAgICAgICAgbWcuc2V0TWF4TG9jYWxzKCk7DQogICAgICAgIHJldHVybiBtZzsNCiAg
ICB9DQoNCiAgICAvKioNCiAgICAgKiBBZGRzIGEgcHJlZml4IHRvIHRoZSBvcmlnaW5hbCBt
ZXRob2QuDQogICAgICogVG8gbWFrZSBpdCBjYWxsYWJsZSBvbmx5IGZyb20gd2l0aGluIHRo
ZSBmcmFtZXdvcmsgaXRzZWxmLg0KICAgICAqDQogICAgICogQHBhcmFtIGNwIHRoZSBDb25z
dGFudFBvb2xHZW4NCiAgICAgKiBAcGFyYW0gY2cgdGhlIENsYXNzR2VuDQogICAgICogQHBh
cmFtIG1nIHRoZSBNZXRob2RHZW4NCiAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBjdXJyZW50
IG1ldGhvZA0KICAgICAqIEBwYXJhbSBtZXRob2RTZXF1ZW5jZSB0aGUgbWV0aG9kcyBzZXF1
ZW5jZSBudW1iZXINCiAgICAgKiBAcmV0dXJuIHRoZSBtb2RpZmllZCBtZXRob2QNCiAgICAg
Ki8NCiAgICBwcml2YXRlIE1ldGhvZEdlbiBhZGRQcmVmaXhUb01ldGhvZChmaW5hbCBDb25z
dGFudFBvb2xHZW4gY3AsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZmluYWwgQ2xhc3NHZW4gY2csDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZmluYWwgTWV0aG9kR2VuIG1nLA0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QsDQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1ldGhvZFNlcXVlbmNlKSB7DQoN
CiAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIG1ldGhvZE5hbWUgPSBnZXRQcmVmaXhlZE1l
dGhvZE5hbWUobWV0aG9kLCBtZXRob2RTZXF1ZW5jZSk7DQoNCiAgICAgICAgLy8gY2hhbmdl
IHRoZSBtZXRob2QgYWNjZXNzIGZsYWdzDQogICAgICAgIGludCBhY2Nlc3NGbGFncyA9IG1n
LmdldEFjY2Vzc0ZsYWdzKCk7DQogICAgICAgIGlmICgoYWNjZXNzRmxhZ3MgJiBDb25zdGFu
dHMuQUNDX1BSSVZBVEUpICE9IDApIHsNCiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRs
bigiaXMgcHJpdmF0ZSIpOw0KICAgICAgICAgICAgLy8gY2xlYXIgdGhlIHByaXZhdGUgZmxh
Zw0KICAgICAgICAgICAgYWNjZXNzRmxhZ3MgJj0gfkNvbnN0YW50cy5BQ0NfUFJJVkFURTsN
CiAgICAgICAgfQ0KICAgICAgICBpZiAoKGFjY2Vzc0ZsYWdzICYgQ29uc3RhbnRzLkFDQ19Q
Uk9URUNURUQpICE9IDApIHsNCiAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBwcm90ZWN0ZWQg
ZmxhZw0KICAgICAgICAgICAgYWNjZXNzRmxhZ3MgJj0gfkNvbnN0YW50cy5BQ0NfUFJPVEVD
VEVEOw0KICAgICAgICB9DQogICAgICAgIGlmICgoYWNjZXNzRmxhZ3MgJiBDb25zdGFudHMu
QUNDX1BVQkxJQykgPT0gMCkgew0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJz
ZXR0aW5nIGl0IHRvIHB1YmxpYyIpOw0KICAgICAgICAgICAgLy8gc2V0IHRoZSBwdWJsaWMg
ZmxhZw0KICAgICAgICAgICAgYWNjZXNzRmxhZ3MgfD0gQ29uc3RhbnRzLkFDQ19QVUJMSUM7
DQogICAgICAgIH0NCiAgICAgICAgLy8gdXBkYXRlIHRoZSBtZXRob2QNCiAgICAgICAgZmlu
YWwgTWV0aG9kR2VuIHByZWZpeGVkTWV0aG9kID0gbmV3IE1ldGhvZEdlbigNCiAgICAgICAg
ICAgICAgICBhY2Nlc3NGbGFncywNCiAgICAgICAgICAgICAgICBtZy5nZXRSZXR1cm5UeXBl
KCksDQogICAgICAgICAgICAgICAgbWcuZ2V0QXJndW1lbnRUeXBlcygpLA0KICAgICAgICAg
ICAgICAgIG1nLmdldEFyZ3VtZW50TmFtZXMoKSwNCiAgICAgICAgICAgICAgICBtZXRob2RO
YW1lLnRvU3RyaW5nKCksDQogICAgICAgICAgICAgICAgY2cuZ2V0Q2xhc3NOYW1lKCksDQog
ICAgICAgICAgICAgICAgbWcuZ2V0SW5zdHJ1Y3Rpb25MaXN0KCksDQogICAgICAgICAgICAg
ICAgY3ApOw0KDQogICAgICAgIC8vIGFkZCB0aGUgZXhjZXB0aW9ucw0KICAgICAgICBmaW5h
bCBTdHJpbmdbXSBleGNlcHRpb25zID0gbWcuZ2V0RXhjZXB0aW9ucygpOw0KICAgICAgICBm
b3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAg
ICAgIHByZWZpeGVkTWV0aG9kLmFkZEV4Y2VwdGlvbihleGNlcHRpb25zW2ldKTsNCiAgICAg
ICAgfQ0KDQogICAgICAgIC8vIGFkZCB0aGUgZXhjZXB0aW9uIGhhbmRsZXJzDQogICAgICAg
IGZpbmFsIENvZGVFeGNlcHRpb25HZW5bXSBleGNlcHRpb25IYW5kbGVycyA9IG1nLmdldEV4
Y2VwdGlvbkhhbmRsZXJzKCk7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0
aW9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHByZWZpeGVkTWV0aG9k
LmFkZEV4Y2VwdGlvbkhhbmRsZXIoDQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkhh
bmRsZXJzW2ldLmdldFN0YXJ0UEMoKSwNCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9u
SGFuZGxlcnNbaV0uZ2V0RW5kUEMoKSwNCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9u
SGFuZGxlcnNbaV0uZ2V0SGFuZGxlclBDKCksDQogICAgICAgICAgICAgICAgICAgIGV4Y2Vw
dGlvbkhhbmRsZXJzW2ldLmdldENhdGNoVHlwZSgpKTsNCiAgICAgICAgfQ0KDQogICAgICAg
IHByZWZpeGVkTWV0aG9kLnNldE1heFN0YWNrKCk7DQogICAgICAgIHByZWZpeGVkTWV0aG9k
LnNldE1heExvY2FscygpOw0KDQogICAgICAgIHJldHVybiBwcmVmaXhlZE1ldGhvZDsNCiAg
ICB9DQoNCiAgICAvKioNCiAgICAgKiBDcmVhdGVzIGEgcHJveHkgbWV0aG9kIGZvciB0aGUg
b3JpZ2luYWwgbWV0aG9kIHNwZWNpZmllZC4NCiAgICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhl
IHNhbWUgc2lnbmF0dXJlIGFzIHRoZSBvcmlnaW5hbCBtZXRob2QgYW5kDQogICAgICogY2F0
Y2hlcyB0aGUgaW52b2NhdGlvbiBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IHRoZSBmcmFt
ZXdvcmsNCiAgICAgKiBiZWZvcmUgcmVkaXJlY3RpbmcgdG8gdGhlIG9yaWdpbmFsIG1ldGhv
ZC4NCiAgICAgKg0KICAgICAqIEBwYXJhbSBjcCB0aGUgQ29uc3RhbnRQb29sR2VuDQogICAg
ICogQHBhcmFtIGNnIHRoZSBDbGFzc0dlbg0KICAgICAqIEBwYXJhbSBvcmlnaW5hbE1ldGhv
ZCB0aGUgY3VycmVudCBtZXRob2QNCiAgICAgKiBAcGFyYW0gZmFjdG9yeSB0aGUgb2JqZWN0
ZmFjdG9yeQ0KICAgICAqIEBwYXJhbSBtZXRob2RJZCB0aGUgaWQgb2YgdGhlIGN1cnJlbnQg
bWV0aG9kIGluIHRoZSBsb29rdXAgdGFibA0KICAgICAqIEBwYXJhbSBtZXRob2RTZXF1ZW5j
ZSB0aGUgbWV0aG9kcyBzZXF1ZW5jZSBudW1iZXINCiAgICAgKiBAcGFyYW0gYWNjZXNzRmxh
Z3MgdGhlIGFjY2VzcyBmbGFncyBvZiB0aGUgb3JpZ2luYWwgbWV0aG9kDQogICAgICogQHBh
cmFtIGlzVGhyZWFkU2FmZQ0KICAgICAqIEByZXR1cm4gdGhlIHByb3h5IG1ldGhvZA0KICAg
ICAqLw0KICAgIHByaXZhdGUgTWV0aG9kIGNyZWF0ZVByb3h5TWV0aG9kKGZpbmFsIENvbnN0
YW50UG9vbEdlbiBjcCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm
aW5hbCBDbGFzc0dlbiBjZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmaW5hbCBNZXRob2RHZW4gb3JpZ2luYWxNZXRob2QsDQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZmluYWwgSW5zdHJ1Y3Rpb25GYWN0b3J5IGZhY3RvcnksDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1ldGhvZElk
LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtZXRo
b2RTZXF1ZW5jZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5h
bCBpbnQgYWNjZXNzRmxhZ3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZmluYWwgYm9vbGVhbiBpc1RocmVhZFNhZmUpIHsNCg0KICAgICAgICBmaW5hbCBJbnN0
cnVjdGlvbkxpc3QgaWwgPSBuZXcgSW5zdHJ1Y3Rpb25MaXN0KCk7DQoNCiAgICAgICAgZmlu
YWwgVHlwZVtdIHBhcmFtZXRlclR5cGVzID0gVHlwZS5nZXRBcmd1bWVudFR5cGVzKG9yaWdp
bmFsTWV0aG9kLmdldFNpZ25hdHVyZSgpKTsNCiAgICAgICAgZmluYWwgVHlwZSByZXR1cm5U
eXBlID0gVHlwZS5nZXRSZXR1cm5UeXBlKG9yaWdpbmFsTWV0aG9kLmdldFNpZ25hdHVyZSgp
KTsNCiAgICAgICAgZmluYWwgU3RyaW5nW10gcGFyYW1ldGVyTmFtZXMgPSBvcmlnaW5hbE1l
dGhvZC5nZXRBcmd1bWVudE5hbWVzKCk7DQoNCiAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVy
IGpvaW5Qb2ludCA9IGdldEpvaW5Qb2ludE5hbWUob3JpZ2luYWxNZXRob2QuZ2V0TWV0aG9k
KCksIG1ldGhvZFNlcXVlbmNlKTsNCg0KICAgICAgICBmaW5hbCBNZXRob2RHZW4gbWV0aG9k
ID0gbmV3IE1ldGhvZEdlbigNCiAgICAgICAgICAgICAgICBhY2Nlc3NGbGFncywNCiAgICAg
ICAgICAgICAgICByZXR1cm5UeXBlLA0KICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVz
LA0KICAgICAgICAgICAgICAgIHBhcmFtZXRlck5hbWVzLA0KICAgICAgICAgICAgICAgIG9y
aWdpbmFsTWV0aG9kLmdldE5hbWUoKSwNCiAgICAgICAgICAgICAgICBjZy5nZXRDbGFzc05h
bWUoKSwNCiAgICAgICAgICAgICAgICBpbCwgY3ApOw0KDQogICAgICAgIG1ldGhvZC5hZGRF
eGNlcHRpb24oImphdmEubGFuZy5UaHJvd2FibGUiKTsNCg0KICAgICAgICBpbnQgaW5kZXhQ
YXJhbSA9IDE7DQogICAgICAgIGludCBpbmRleFN0YWNrID0gMDsNCiAgICAgICAgaW50IGlu
ZGV4Sm9pblBvaW50ID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoICogMiArIDE7DQoNCiAgICAg
ICAgQnJhbmNoSW5zdHJ1Y3Rpb24gYmlJZk5vdE51bGwgPSBudWxsOw0KICAgICAgICBJbnN0
cnVjdGlvbkhhbmRsZSBpaElmTm90TnVsbCA9IG51bGw7DQogICAgICAgIGlmIChpc1RocmVh
ZFNhZmUpIHsNCiAgICAgICAgICAgIC8vIE9iamVjdCBqb2luUG9pbnQgPSBfX19qcC5nZXQo
KTsNCiAgICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUxvYWQoVHlwZS5PQkpF
Q1QsIDApKTsNCiAgICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUZpZWxkQWNj
ZXNzKA0KICAgICAgICAgICAgICAgICAgICBjZy5nZXRDbGFzc05hbWUoKSwNCiAgICAgICAg
ICAgICAgICAgICAgam9pblBvaW50LnRvU3RyaW5nKCksDQogICAgICAgICAgICAgICAgICAg
IG5ldyBPYmplY3RUeXBlKCJqYXZhLmxhbmcuVGhyZWFkTG9jYWwiKSwNCiAgICAgICAgICAg
ICAgICAgICAgQ29uc3RhbnRzLkdFVEZJRUxEKSk7DQogICAgICAgICAgICBpbC5hcHBlbmQo
ZmFjdG9yeS5jcmVhdGVJbnZva2UoDQogICAgICAgICAgICAgICAgICAgICJqYXZhLmxhbmcu
VGhyZWFkTG9jYWwiLA0KICAgICAgICAgICAgICAgICAgICAiZ2V0IiwNCiAgICAgICAgICAg
ICAgICAgICAgVHlwZS5PQkpFQ1QsDQogICAgICAgICAgICAgICAgICAgIFR5cGUuTk9fQVJH
UywNCiAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLklOVk9LRVZJUlRVQUwpKTsNCiAg
ICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZVN0b3JlKFR5cGUuT0JKRUNULCBp
bmRleEpvaW5Qb2ludCkpOw0KDQogICAgICAgICAgICAvLyBpZiAoam9pblBvaW50ID09IG51
bGwpIHsNCiAgICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUxvYWQoVHlwZS5P
QkpFQ1QsIGluZGV4Sm9pblBvaW50KSk7DQogICAgICAgICAgICBiaUlmTm90TnVsbCA9IGZh
Y3RvcnkuY3JlYXRlQnJhbmNoSW5zdHJ1Y3Rpb24oQ29uc3RhbnRzLklGTk9OTlVMTCwgbnVs
bCk7DQogICAgICAgICAgICBpbC5hcHBlbmQoYmlJZk5vdE51bGwpOw0KDQogICAgICAgICAg
ICAvLyBqb2luUG9pbnQgPSBuZXcgTWVtYmVyTWV0aG9kSm9pblBvaW50KHRoaXMsIDEwKTsN
CiAgICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZU5ldygNCiAgICAgICAgICAg
ICAgICAgICAgVHJhbnNmb3JtYXRpb25VdGlsLk1FTUJFUl9NRVRIT0RfSk9JTl9QT0lOVF9D
TEFTUykpOw0KICAgICAgICAgICAgaWwuYXBwZW5kKEluc3RydWN0aW9uQ29uc3RhbnRzLkRV
UCk7DQogICAgICAgICAgICBpbC5hcHBlbmQoZmFjdG9yeS5jcmVhdGVMb2FkKFR5cGUuT0JK
RUNULCAwKSk7DQogICAgICAgICAgICBpbC5hcHBlbmQobmV3IFBVU0goY3AsIG1ldGhvZElk
KSk7DQogICAgICAgICAgICBpbC5hcHBlbmQoZmFjdG9yeS5jcmVhdGVJbnZva2UoDQogICAg
ICAgICAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uVXRpbC5NRU1CRVJfTUVUSE9EX0pPSU5f
UE9JTlRfQ0xBU1MsDQogICAgICAgICAgICAgICAgICAgICI8aW5pdD4iLA0KICAgICAgICAg
ICAgICAgICAgICBUeXBlLlZPSUQsDQogICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlW117
VHlwZS5PQkpFQ1QsIFR5cGUuSU5UfSwNCiAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRz
LklOVk9LRVNQRUNJQUwpKTsNCiAgICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0
ZVN0b3JlKFR5cGUuT0JKRUNULCBpbmRleEpvaW5Qb2ludCkpOw0KDQogICAgICAgICAgICAv
LyBfX19qcC5zZXQoam9pblBvaW50KTsNCiAgICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5
LmNyZWF0ZUxvYWQoVHlwZS5PQkpFQ1QsIDApKTsNCiAgICAgICAgICAgIGlsLmFwcGVuZChm
YWN0b3J5LmNyZWF0ZUZpZWxkQWNjZXNzKA0KICAgICAgICAgICAgICAgICAgICBjZy5nZXRD
bGFzc05hbWUoKSwNCiAgICAgICAgICAgICAgICAgICAgam9pblBvaW50LnRvU3RyaW5nKCks
DQogICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RUeXBlKCJqYXZhLmxhbmcuVGhyZWFk
TG9jYWwiKSwNCiAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkdFVEZJRUxEKSk7DQog
ICAgICAgICAgICBpbC5hcHBlbmQoZmFjdG9yeS5jcmVhdGVMb2FkKFR5cGUuT0JKRUNULCBp
bmRleEpvaW5Qb2ludCkpOw0KICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRl
SW52b2tlKA0KICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLlRocmVhZExvY2FsIiwN
CiAgICAgICAgICAgICAgICAgICAgInNldCIsDQogICAgICAgICAgICAgICAgICAgIFR5cGUu
Vk9JRCwNCiAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVbXXtUeXBlLk9CSkVDVH0sDQog
ICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5JTlZPS0VWSVJUVUFMKSk7DQoNCiAgICAg
ICAgICAgIGloSWZOb3ROdWxsID0gaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlTG9hZChUeXBl
Lk9CSkVDVCwgaW5kZXhKb2luUG9pbnQpKTsNCiAgICAgICAgICAgIGlsLmFwcGVuZChmYWN0
b3J5LmNyZWF0ZUNoZWNrQ2FzdCgNCiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtYXRp
b25VdGlsLk1FTUJFUl9NRVRIT0RfSk9JTl9QT0lOVF9UWVBFKSk7DQogICAgICAgICAgICBp
bmRleEpvaW5Qb2ludCArPSAyOw0KICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3Jl
YXRlU3RvcmUoVHlwZS5PQkpFQ1QsIGluZGV4Sm9pblBvaW50KSk7DQoNCiAgICAgICAgICAg
IGJpSWZOb3ROdWxsLnNldFRhcmdldChpaElmTm90TnVsbCk7DQogICAgICAgIH0NCg0KICAg
ICAgICAvLyBpZiB3ZSBoYXZlIHBhcmFtZXRlcnMsIHdyYXAgdGhlbSB1cA0KICAgICAgICBp
ZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoICE9IDApIHsNCg0KICAgICAgICAgICAgLy8gY3Jl
YXRlIGFuZCBhbGxvY2F0ZSB0aGUgcGFyYW1ldGVycyBhcnJheQ0KICAgICAgICAgICAgaWwu
YXBwZW5kKG5ldyBQVVNIKGNwLCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGgpKTsNCiAgICAgICAg
ICAgIGlsLmFwcGVuZCgoQ1BJbnN0cnVjdGlvbilmYWN0b3J5LmNyZWF0ZU5ld0FycmF5KFR5
cGUuT0JKRUNULCAoc2hvcnQpMSkpOw0KDQogICAgICAgICAgICBpbC5hcHBlbmQoSW5zdHJ1
Y3Rpb25Db25zdGFudHMuRFVQKTsNCiAgICAgICAgICAgIGlsLmFwcGVuZChuZXcgUFVTSChj
cCwgaW5kZXhTdGFjaykpOw0KICAgICAgICAgICAgaW5kZXhTdGFjaysrOw0KDQogICAgICAg
ICAgICAvLyBhZGQgYWxsIHRoZSBwYXJhbWV0ZXJzLCB3cmFwIHRoZSBwcmltaXRpdmUgdHlw
ZXMgaW4gdGhlaXIgb2JqZWN0IGNvdW50ZXJwYXJ0cw0KICAgICAgICAgICAgZm9yIChpbnQg
Y291bnQgPSAwOyBjb3VudCA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgY291bnQrKykgew0K
DQogICAgICAgICAgICAgICAgU3RyaW5nIHdyYXBwZXJDbGFzcyA9IG51bGw7DQogICAgICAg
ICAgICAgICAgQmFzaWNUeXBlIHR5cGUgPSBudWxsOw0KICAgICAgICAgICAgICAgIGJvb2xl
YW4gaGFzTG9uZ09yRG91YmxlID0gZmFsc2U7DQoNCiAgICAgICAgICAgICAgICBpZiAocGFy
YW1ldGVyVHlwZXNbY291bnRdIGluc3RhbmNlb2YgT2JqZWN0VHlwZSB8fA0KICAgICAgICAg
ICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZXNbY291bnRdIGluc3RhbmNlb2YgQXJyYXlU
eXBlKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYW4gb2JqZWN0IG9yIGFu
IGFycmF5DQogICAgICAgICAgICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUxv
YWQoVHlwZS5PQkpFQ1QsIGluZGV4UGFyYW0pKTsNCiAgICAgICAgICAgICAgICAgICAgaWwu
YXBwZW5kKEluc3RydWN0aW9uQ29uc3RhbnRzLkFBU1RPUkUpOw0KICAgICAgICAgICAgICAg
ICAgICBpbmRleFBhcmFtKys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAg
IGVsc2UgaWYgKHBhcmFtZXRlclR5cGVzW2NvdW50XSBpbnN0YW5jZW9mIEFycmF5VHlwZSkg
ew0KICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGFuIGFycmF5DQogICAgICAgICAg
ICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUxvYWQoVHlwZS5PQkpFQ1QsIGlu
ZGV4UGFyYW0pKTsNCiAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKEluc3RydWN0aW9u
Q29uc3RhbnRzLkFBU1RPUkUpOw0KICAgICAgICAgICAgICAgICAgICBpbmRleFBhcmFtKys7
DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtZXRl
clR5cGVzW2NvdW50XSBpbnN0YW5jZW9mIEJhc2ljVHlwZSkgew0KICAgICAgICAgICAgICAg
ICAgICBoYXNMb25nT3JEb3VibGUgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgLy8g
d2UgaGF2ZSBhIHByaW1pdGl2ZSB0eXBlDQogICAgICAgICAgICAgICAgICAgIGlmICgocGFy
YW1ldGVyVHlwZXNbY291bnRdKS5lcXVhbHMoVHlwZS5MT05HKSkgew0KICAgICAgICAgICAg
ICAgICAgICAgICAgd3JhcHBlckNsYXNzID0gImphdmEubGFuZy5Mb25nIjsNCiAgICAgICAg
ICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLkxPTkc7DQogICAgICAgICAgICAgICAgICAg
ICAgICBoYXNMb25nT3JEb3VibGUgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQog
ICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwYXJhbWV0ZXJUeXBlc1tjb3VudF0pLmVx
dWFscyhUeXBlLklOVCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJDbGFz
cyA9ICJqYXZhLmxhbmcuSW50ZWdlciI7DQogICAgICAgICAgICAgICAgICAgICAgICB0eXBl
ID0gVHlwZS5JTlQ7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAg
ICAgZWxzZSBpZiAoKHBhcmFtZXRlclR5cGVzW2NvdW50XSkuZXF1YWxzKFR5cGUuU0hPUlQp
KSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyQ2xhc3MgPSAiamF2YS5sYW5n
LlNob3J0IjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLlNIT1JUOw0K
ICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChw
YXJhbWV0ZXJUeXBlc1tjb3VudF0pLmVxdWFscyhUeXBlLkRPVUJMRSkpIHsNCiAgICAgICAg
ICAgICAgICAgICAgICAgIHdyYXBwZXJDbGFzcyA9ICJqYXZhLmxhbmcuRG91YmxlIjsNCiAg
ICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLkRPVUJMRTsNCiAgICAgICAgICAg
ICAgICAgICAgICAgIGhhc0xvbmdPckRvdWJsZSA9IHRydWU7DQogICAgICAgICAgICAgICAg
ICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHBhcmFtZXRlclR5cGVzW2Nv
dW50XSkuZXF1YWxzKFR5cGUuRkxPQVQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3
cmFwcGVyQ2xhc3MgPSAiamF2YS5sYW5nLkZsb2F0IjsNCiAgICAgICAgICAgICAgICAgICAg
ICAgIHR5cGUgPSBUeXBlLkZMT0FUOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAg
ICAgICAgICAgICAgIGVsc2UgaWYgKChwYXJhbWV0ZXJUeXBlc1tjb3VudF0pLmVxdWFscyhU
eXBlLkNIQVIpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyQ2xhc3MgPSAi
amF2YS5sYW5nLkNoYXJhY3RlciI7DQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0g
VHlwZS5DSEFSOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAg
IGVsc2UgaWYgKChwYXJhbWV0ZXJUeXBlc1tjb3VudF0pLmVxdWFscyhUeXBlLkJZVEUpKSB7
DQogICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyQ2xhc3MgPSAiamF2YS5sYW5nLkJ5
dGUiOw0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFR5cGUuQllURTsNCiAgICAg
ICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocGFyYW1l
dGVyVHlwZXNbY291bnRdKS5lcXVhbHMoVHlwZS5CT09MRUFOKSkgew0KICAgICAgICAgICAg
ICAgICAgICAgICAgd3JhcHBlckNsYXNzID0gImphdmEubGFuZy5Cb29sZWFuIjsNCiAgICAg
ICAgICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLkJPT0xFQU47DQogICAgICAgICAgICAg
ICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAg
ICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidW5rbm93biBwYXJhbWV0ZXIg
dHlwZTogIiArIHBhcmFtZXRlclR5cGVzW2NvdW50XSk7DQogICAgICAgICAgICAgICAgICAg
IH0NCiAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlTmV3KHdy
YXBwZXJDbGFzcykpOw0KICAgICAgICAgICAgICAgICAgICBpbC5hcHBlbmQoSW5zdHJ1Y3Rp
b25Db25zdGFudHMuRFVQKTsNCiAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3Rv
cnkuY3JlYXRlTG9hZCh0eXBlLCBpbmRleFBhcmFtKSk7DQogICAgICAgICAgICAgICAgICAg
IGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUludm9rZSgNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB3cmFwcGVyQ2xhc3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxp
bml0PiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZS5WT0lELA0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlW117dHlwZX0sDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgQ29uc3RhbnRzLklOVk9LRVNQRUNJQUwpKTsNCiAgICAgICAgICAg
ICAgICAgICAgaWwuYXBwZW5kKEluc3RydWN0aW9uQ29uc3RhbnRzLkFBU1RPUkUpOw0KICAg
ICAgICAgICAgICAgICAgICBpbmRleFBhcmFtKys7DQogICAgICAgICAgICAgICAgfSAvLyBl
bmQgaGFuZGxlIGJhc2ljIG9yIG9iamVjdCB0eXBlDQoNCiAgICAgICAgICAgICAgICBpZiAo
Y291bnQgIT0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMSkgew0KICAgICAgICAgICAgICAg
ICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIHRoZSBsYXN0IHBhcmFtZXRlciwgY3JlYXRlIHRo
ZSBwYXJhbWV0ZXIgb24gdGhlIHN0YWNrDQogICAgICAgICAgICAgICAgICAgIGlsLmFwcGVu
ZChJbnN0cnVjdGlvbkNvbnN0YW50cy5EVVApOw0KICAgICAgICAgICAgICAgICAgICBpbC5h
cHBlbmQobmV3IFBVU0goY3AsIGluZGV4U3RhY2spKTsNCiAgICAgICAgICAgICAgICAgICAg
aW5kZXhTdGFjaysrOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIGxvbmcgb3IgZG91Ymxl
IG5lZWRzIHR3byByZWdpc3RlcnMgdG8gZml0DQogICAgICAgICAgICAgICAgICAgIGlmICho
YXNMb25nT3JEb3VibGUpIGluZGV4UGFyYW0rKzsNCiAgICAgICAgICAgICAgICB9DQogICAg
ICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgb2JqZWN0IGFycmF5DQog
ICAgICAgICAgICBpbC5hcHBlbmQoZmFjdG9yeS5jcmVhdGVTdG9yZShUeXBlLk9CSkVDVCwg
aW5kZXhQYXJhbSkpOw0KDQogICAgICAgICAgICBpZiAoaXNUaHJlYWRTYWZlKSB7DQogICAg
ICAgICAgICAgICAgLy8gaWYgdGhyZWFkc2FmZSBncmFiIHRoZSBuZXdseSByZXRyaWV2ZWQg
bG9jYWwgam9pbiBwb2ludCBmaWVsZCBmcm9tIHRoZSBzdGFjaw0KICAgICAgICAgICAgICAg
IGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUxvYWQoVHlwZS5PQkpFQ1QsIGluZGV4Sm9pblBv
aW50KSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAg
ICAgICAvLyBncmFiIHRoZSBqb2luIHBvaW50IG1lbWJlciBmaWVsZA0KICAgICAgICAgICAg
ICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUxvYWQoVHlwZS5PQkpFQ1QsIDApKTsNCiAg
ICAgICAgICAgICAgICBpbC5hcHBlbmQoZmFjdG9yeS5jcmVhdGVGaWVsZEFjY2VzcygNCiAg
ICAgICAgICAgICAgICAgICAgICAgIGNnLmdldENsYXNzTmFtZSgpLA0KICAgICAgICAgICAg
ICAgICAgICAgICAgam9pblBvaW50LnRvU3RyaW5nKCksDQogICAgICAgICAgICAgICAgICAg
ICAgICBUcmFuc2Zvcm1hdGlvblV0aWwuTUVNQkVSX01FVEhPRF9KT0lOX1BPSU5UX1RZUEUs
DQogICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuR0VURklFTEQpKTsNCg0KICAg
ICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gaW52b2tlIGpvaW5Qb2ludC5zZXRQYXJhbWV0
ZXIoLi4pDQogICAgICAgICAgICBpbC5hcHBlbmQoZmFjdG9yeS5jcmVhdGVMb2FkKFR5cGUu
T0JKRUNULCBpbmRleFBhcmFtKSk7DQogICAgICAgICAgICBpbC5hcHBlbmQoZmFjdG9yeS5j
cmVhdGVJbnZva2UoDQogICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uVXRpbC5N
RU1CRVJfTUVUSE9EX0pPSU5fUE9JTlRfQ0xBU1MsDQogICAgICAgICAgICAgICAgICAgICJz
ZXRQYXJhbWV0ZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgVHlwZS5WT0lELA0KICAgICAg
ICAgICAgICAgICAgICBuZXcgVHlwZVtde25ldyBBcnJheVR5cGUoVHlwZS5PQkpFQ1QsIDEp
fSwNCiAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLklOVk9LRVZJUlRVQUwpKTsNCiAg
ICAgICAgICAgIGluZGV4UGFyYW0rKzsNCg0KICAgICAgICB9IC8vIGVuZCAtIGlmIHBhcmFt
ZXRlcnMubGVuZ3RoICE9IDANCg0KICAgICAgICBpZiAoaXNUaHJlYWRTYWZlKSB7DQogICAg
ICAgICAgICAvLyBpZiB0aHJlYWRzYWZlIGdyYWIgdGhlIG5ld2x5IHJldHJpZXZlZCBsb2Nh
bCBqb2luIHBvaW50IGZpZWxkIGZyb20gdGhlIHN0YWNrDQogICAgICAgICAgICBpbC5hcHBl
bmQoZmFjdG9yeS5jcmVhdGVMb2FkKFR5cGUuT0JKRUNULCBpbmRleEpvaW5Qb2ludCkpOw0K
ICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlSW52b2tlKA0KICAgICAgICAg
ICAgICAgICAgICBUcmFuc2Zvcm1hdGlvblV0aWwuTUVNQkVSX01FVEhPRF9KT0lOX1BPSU5U
X0NMQVNTLA0KICAgICAgICAgICAgICAgICAgICAicHJvY2VlZCIsIFR5cGUuT0JKRUNULCBU
eXBlLk5PX0FSR1MsIENvbnN0YW50cy5JTlZPS0VWSVJUVUFMKSk7DQogICAgICAgIH0NCiAg
ICAgICAgZWxzZSB7DQogICAgICAgICAgICAvLyBncmFiIHRoZSBqb2luIHBvaW50IG1lbWJl
ciBmaWVsZA0KICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlTG9hZChUeXBl
Lk9CSkVDVCwgMCkpOw0KICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlRmll
bGRBY2Nlc3MoDQogICAgICAgICAgICAgICAgICAgIGNnLmdldENsYXNzTmFtZSgpLA0KICAg
ICAgICAgICAgICAgICAgICBqb2luUG9pbnQudG9TdHJpbmcoKSwNCiAgICAgICAgICAgICAg
ICAgICAgVHJhbnNmb3JtYXRpb25VdGlsLk1FTUJFUl9NRVRIT0RfSk9JTl9QT0lOVF9UWVBF
LA0KICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuR0VURklFTEQpKTsNCg0KICAgICAg
ICAgICAgLy8gaW52b2tlIGpvaW5Qb2ludC5wcm9jZWVkKCkNCiAgICAgICAgICAgIGlsLmFw
cGVuZChmYWN0b3J5LmNyZWF0ZUludm9rZSgNCiAgICAgICAgICAgICAgICAgICAgVHJhbnNm
b3JtYXRpb25VdGlsLk1FTUJFUl9NRVRIT0RfSk9JTl9QT0lOVF9DTEFTUywNCiAgICAgICAg
ICAgICAgICAgICAgInByb2NlZWQiLA0KICAgICAgICAgICAgICAgICAgICBUeXBlLk9CSkVD
VCwNCiAgICAgICAgICAgICAgICAgICAgVHlwZS5OT19BUkdTLA0KICAgICAgICAgICAgICAg
ICAgICBDb25zdGFudHMuSU5WT0tFVklSVFVBTCkpOw0KICAgICAgICB9DQoNCiAgICAgICAg
aWYgKCFyZXR1cm5UeXBlLmVxdWFscyhUeXBlLlZPSUQpKSB7DQogICAgICAgICAgICAvLyBj
cmVhdGUgdGhlIHJlc3VsdCBmcm9tIHRoZSBpbnZvY2F0aW9uDQogICAgICAgICAgICBpbC5h
cHBlbmQoZmFjdG9yeS5jcmVhdGVTdG9yZShUeXBlLk9CSkVDVCwgaW5kZXhQYXJhbSkpOw0K
ICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlTG9hZChUeXBlLk9CSkVDVCwg
aW5kZXhQYXJhbSkpOw0KDQogICAgICAgICAgICAvLyBjYXN0IHRoZSByZXN1bHQgYW5kIHJl
dHVybiBpdCwgaWYgdGhlIHJldHVybiB0eXBlIGlzIGENCiAgICAgICAgICAgIC8vIHByaW1p
dGl2ZSB0eXBlLCByZXRyaWV2ZSBpdCBmcm9tIHRoZSB3cmFwcGVkIG9iamVjdCBmaXJzdA0K
ICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgaW5zdGFuY2VvZiBCYXNpY1R5cGUpIHsNCiAg
ICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoVHlwZS5MT05HKSkgew0KICAg
ICAgICAgICAgICAgICAgICBpbC5hcHBlbmQoZmFjdG9yeS5jcmVhdGVDaGVja0Nhc3QobmV3
IE9iamVjdFR5cGUoImphdmEubGFuZy5Mb25nIikpKTsNCiAgICAgICAgICAgICAgICAgICAg
aWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlSW52b2tlKA0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICJqYXZhLmxhbmcuTG9uZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ImxvbmdWYWx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZS5MT05HLA0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUuTk9fQVJHUywNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBDb25zdGFudHMuSU5WT0tFVklSVFVBTCkpOw0KICAgICAgICAg
ICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXR1cm5UeXBlLmVxdWFscyhU
eXBlLklOVCkpIHsNCiAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3Jl
YXRlQ2hlY2tDYXN0KG5ldyBPYmplY3RUeXBlKCJqYXZhLmxhbmcuSW50ZWdlciIpKSk7DQog
ICAgICAgICAgICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUludm9rZSgNCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLkludGVnZXIiLA0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJpbnRWYWx1ZSIsDQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgVHlwZS5JTlQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZS5O
T19BUkdTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5JTlZPS0VW
SVJUVUFMKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYg
KHJldHVyblR5cGUuZXF1YWxzKFR5cGUuU0hPUlQpKSB7DQogICAgICAgICAgICAgICAgICAg
IGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUNoZWNrQ2FzdChuZXcgT2JqZWN0VHlwZSgiamF2
YS5sYW5nLlNob3J0IikpKTsNCiAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3Rv
cnkuY3JlYXRlSW52b2tlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhLmxh
bmcuU2hvcnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG9ydFZhbHVlIiwN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLlNIT1JULA0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFR5cGUuTk9fQVJHUywNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBDb25zdGFudHMuSU5WT0tFVklSVFVBTCkpOw0KICAgICAgICAgICAgICAgIH0NCiAg
ICAgICAgICAgICAgICBlbHNlIGlmIChyZXR1cm5UeXBlLmVxdWFscyhUeXBlLkRPVUJMRSkp
IHsNCiAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlQ2hlY2tD
YXN0KG5ldyBPYmplY3RUeXBlKCJqYXZhLmxhbmcuRG91YmxlIikpKTsNCiAgICAgICAgICAg
ICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlSW52b2tlKA0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuRG91YmxlIiwNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiZG91YmxlVmFsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFR5cGUuRE9VQkxFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUuTk9fQVJH
UywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuSU5WT0tFVklSVFVB
TCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXR1
cm5UeXBlLmVxdWFscyhUeXBlLkZMT0FUKSkgew0KICAgICAgICAgICAgICAgICAgICBpbC5h
cHBlbmQoZmFjdG9yeS5jcmVhdGVDaGVja0Nhc3QobmV3IE9iamVjdFR5cGUoImphdmEubGFu
Zy5GbG9hdCIpKSk7DQogICAgICAgICAgICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNy
ZWF0ZUludm9rZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLkZs
b2F0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXRWYWx1ZSIsDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgVHlwZS5GTE9BVCwNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBUeXBlLk5PX0FSR1MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
Q29uc3RhbnRzLklOVk9LRVZJUlRVQUwpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAg
ICAgICAgICAgZWxzZSBpZiAocmV0dXJuVHlwZS5lcXVhbHMoVHlwZS5DSEFSKSkgew0KICAg
ICAgICAgICAgICAgICAgICBpbC5hcHBlbmQoZmFjdG9yeS5jcmVhdGVDaGVja0Nhc3QobmV3
IE9iamVjdFR5cGUoImphdmEubGFuZy5DaGFyYWN0ZXIiKSkpOw0KICAgICAgICAgICAgICAg
ICAgICBpbC5hcHBlbmQoZmFjdG9yeS5jcmVhdGVJbnZva2UoDQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgImphdmEubGFuZy5DaGFyYWN0ZXIiLA0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJjaGFyVmFsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5
cGUuQ0hBUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLk5PX0FSR1MsDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLklOVk9LRVZJUlRVQUwpKTsN
CiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAocmV0dXJuVHlw
ZS5lcXVhbHMoVHlwZS5CWVRFKSkgew0KICAgICAgICAgICAgICAgICAgICBpbC5hcHBlbmQo
ZmFjdG9yeS5jcmVhdGVDaGVja0Nhc3QobmV3IE9iamVjdFR5cGUoImphdmEubGFuZy5CeXRl
IikpKTsNCiAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlSW52
b2tlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuQnl0ZSIsDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVWYWx1ZSIsDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgVHlwZS5CWVRFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFR5cGUuTk9fQVJHUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMu
SU5WT0tFVklSVFVBTCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBl
bHNlIGlmIChyZXR1cm5UeXBlLmVxdWFscyhUeXBlLkJPT0xFQU4pKSB7DQogICAgICAgICAg
ICAgICAgICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZUNoZWNrQ2FzdChuZXcgT2JqZWN0
VHlwZSgiamF2YS5sYW5nLkJvb2xlYW4iKSkpOw0KICAgICAgICAgICAgICAgICAgICBpbC5h
cHBlbmQoZmFjdG9yeS5jcmVhdGVJbnZva2UoDQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgImphdmEubGFuZy5Cb29sZWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAi
Ym9vbGVhblZhbHVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLkJPT0xF
QU4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZS5OT19BUkdTLA0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5JTlZPS0VWSVJUVUFMKSk7DQogICAg
ICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJldHVyblR5cGUuZXF1
YWxzKFR5cGUuVk9JRCkpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcA0KICAgICAg
ICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAg
ICAgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHJldHVybiB0eXBlOiAiICsgcmV0dXJuVHlw
ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxz
ZSB7DQogICAgICAgICAgICAgICAgLy8gY2FzdCB0aGUgcmVzdWx0IHRvIHRoZSByaWdodCB0
eXBlDQogICAgICAgICAgICAgICAgaWwuYXBwZW5kKGZhY3RvcnkuY3JlYXRlQ2FzdChUeXBl
Lk9CSkVDVCwgcmV0dXJuVHlwZSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAg
ICAgIGlsLmFwcGVuZChmYWN0b3J5LmNyZWF0ZVJldHVybihyZXR1cm5UeXBlKSk7DQoNCiAg
ICAgICAgbWV0aG9kLnNldE1heFN0YWNrKCk7DQogICAgICAgIG1ldGhvZC5zZXRNYXhMb2Nh
bHMoKTsNCiAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRNZXRob2QoKTsNCiAgICB9DQoNCiAg
ICAvKioNCiAgICAgKiBKTWFuZ2xlciBjYWxsYmFjayBtZXRob2QuIElzIGJlaW5nIGNhbGxl
ZCBiZWZvcmUgZWFjaCB0cmFuc2Zvcm1hdGlvbi4NCiAgICAgKi8NCiAgICBwdWJsaWMgdm9p
ZCBzZXNzaW9uU3RhcnQoKSB7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogSk1hbmdsZXIg
Y2FsbGJhY2sgbWV0aG9kLiBJcyBiZWluZyBjYWxsZWQgYWZ0ZXIgZWFjaCB0cmFuc2Zvcm1h
dGlvbi4NCiAgICAgKi8NCiAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRW5kKCkgew0KICAgIH0N
Cg0KICAgIC8qKg0KICAgICAqIEpNYW5nbGVyIGNhbGxiYWNrIG1ldGhvZC4gUHJpbnRzIGEg
bG9nL3N0YXR1cyBtZXNzYWdlIGF0IGVhY2ggdHJhbnNmb3JtYXRpb24uDQogICAgICoNCiAg
ICAgKiBAcmV0dXJuIGEgbG9nIHN0cmluZw0KICAgICAqLw0KICAgIHB1YmxpYyBTdHJpbmcg
dmVyYm9zZU1lc3NhZ2UoKSB7DQogICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0
TmFtZSgpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENoZWNrcyBpZiBhIHNwZWNpZmlj
IG1ldGhvZCBuZWVkcyB0byBiZSB0aHJlYWQgc2FmZS4NCiAgICAgKg0KICAgICAqIEBwYXJh
bSBjZyB0aGUgY2xhc3MgZ2VuDQogICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kDQog
ICAgICogQHJldHVybiBib29sZWFuDQogICAgICovDQovLyAgICBwcml2YXRlIGJvb2xlYW4g
aXNUaHJlYWRTYWZlKGZpbmFsIENsYXNzR2VuIGNnLCBmaW5hbCBNZXRob2QgbWV0aG9kKSB7
DQovLyAgICAgICAgYm9vbGVhbiB0aHJlYWRTYWZlID0gZmFsc2U7DQovLyAgICAgICAgaWYg
KG1fd2VhdmVNb2RlbC5oYXNNZXRob2RQb2ludGN1dChjZy5nZXRDbGFzc05hbWUoKSwgbWV0
aG9kLmdldE5hbWUoKSkpIHsNCi8vICAgICAgICAgICAgdGhyZWFkU2FmZSA9IG1fd2VhdmVN
b2RlbC5pc01ldGhvZFBvaW50Y3V0VGhyZWFkU2FmZSgNCi8vICAgICAgICAgICAgICAgICAg
ICBjZy5nZXRDbGFzc05hbWUoKSwgbWV0aG9kLmdldE5hbWUoKSk7DQovLyAgICAgICAgfQ0K
Ly8gICAgICAgIGVsc2UgaWYgKG1fd2VhdmVNb2RlbC5oYXNUaHJvd3NQb2ludGN1dChjZy5n
ZXRDbGFzc05hbWUoKSwgbWV0aG9kLmdldE5hbWUoKSkpIHsNCi8vICAgICAgICAgICAgdGhy
ZWFkU2FmZSA9IG1fd2VhdmVNb2RlbC5pc1Rocm93c1BvaW50Y3V0VGhyZWFkU2FmZSgNCi8v
ICAgICAgICAgICAgICAgICAgICBjZy5nZXRDbGFzc05hbWUoKSwgbWV0aG9kLmdldE5hbWUo
KSk7DQovLyAgICAgICAgfQ0KLy8gICAgICAgIHJldHVybiB0aHJlYWRTYWZlOw0KLy8gICAg
fQ0KDQogICAgLyoqDQogICAgICogRmlsdGVycyB0aGUgY2xhc3NlcyB0byBiZSB0cmFuc2Zv
cm1lZC4NCiAgICAgKg0KICAgICAqIEBwYXJhbSBjZyB0aGUgY2xhc3MgdG8gZmlsdGVyDQog
ICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIG1ldGhvZCBzaG91bGQgYmUgZmls
dGVyZWQgYXdheQ0KICAgICAqLw0KICAgIHByaXZhdGUgYm9vbGVhbiBjbGFzc0ZpbHRlcihm
aW5hbCBDbGFzc0dlbiBjZykgew0KICAgICAgICBpZiAoY2cuaXNJbnRlcmZhY2UoKSkgew0K
ICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQog
ICAgICAgICAgICByZXR1cm4gIW1fd2VhdmVNb2RlbC5oYXNBc3BlY3QoY2cuZ2V0Q2xhc3NO
YW1lKCkpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRmlsdGVycyB0
aGUgbWV0aG9kcyB0byBiZSB0cmFuc2Zvcm1lZC4NCiAgICAgKg0KICAgICAqIEBwYXJhbSBj
ZyB0aGUgQ2xhc3NHZW4NCiAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgdG8gZmls
dGVyDQogICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIG1ldGhvZCBzaG91bGQg
YmUgZmlsdGVyZWQgKHNraXBwZWQpDQogICAgICovDQogICAgcHJpdmF0ZSBib29sZWFuIG1l
dGhvZEZpbHRlcihmaW5hbCBDbGFzc0dlbiBjZywgZmluYWwgTWV0aG9kIG1ldGhvZCkgew0K
ICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoIjxpbml0PiIpKSB7DQogICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAg
ICAgICAgIE1ldGhvZE1ldGFEYXRhIG1ldGhvZE1ldGFEYXRhID0gbmV3IE1ldGhvZE1ldGFE
YXRhKCk7DQogICAgICAgICAgICBtZXRob2RNZXRhRGF0YS5zZXROYW1lKG1ldGhvZC5nZXRO
YW1lKCkpOw0KICAgICAgICAgICAgbWV0aG9kTWV0YURhdGEuc2V0UmV0dXJuVHlwZShtZXRo
b2QuZ2V0UmV0dXJuVHlwZSgpLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgVHlwZVtdIGph
dmFQYXJhbWV0ZXJzID0gbWV0aG9kLmdldEFyZ3VtZW50VHlwZXMoKTsNCiAgICAgICAgICAg
IFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gbmV3IFN0cmluZ1tqYXZhUGFyYW1ldGVycy5s
ZW5ndGhdOw0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBqYXZhUGFyYW1ldGVy
cy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVzW2pdID0g
amF2YVBhcmFtZXRlcnNbal0udG9TdHJpbmcoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAg
ICAgIG1ldGhvZE1ldGFEYXRhLnNldFBhcmFtZXRlclR5cGVzKHBhcmFtZXRlclR5cGVzKTsN
CiAgICAgICAgICAgIGlmIChtX3dlYXZlTW9kZWwuaGFzTWV0aG9kUG9pbnRjdXQoY2cuZ2V0
Q2xhc3NOYW1lKCksIG1ldGhvZE1ldGFEYXRhKSkgew0KICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChtX3dlYXZlTW9kZWwu
aGFzVGhyb3dzUG9pbnRjdXQoY2cuZ2V0Q2xhc3NOYW1lKCksIG1ldGhvZE1ldGFEYXRhKSkg
ew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAg
ICAgfQ0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBS
ZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBqb2luIHBvaW50Lg0KICAgICAqDQogICAgICogQHBh
cmFtIG1ldGhvZCB0aGUgbWV0aG9kDQogICAgICogQHBhcmFtIG1ldGhvZFNlcXVlbmNlIHRo
ZSBtZXRob2Qgc2VxdWVuY2UNCiAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBqb2lu
IHBvaW50DQogICAgICovDQogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nQnVmZmVyIGdldEpv
aW5Qb2ludE5hbWUoZmluYWwgTWV0aG9kIG1ldGhvZCwNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbWV0aG9kU2VxdWVuY2Up
IHsNCiAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGpvaW5Qb2ludCA9IG5ldyBTdHJpbmdC
dWZmZXIoKTsNCiAgICAgICAgam9pblBvaW50LmFwcGVuZChUcmFuc2Zvcm1hdGlvblV0aWwu
TUVNQkVSX01FVEhPRF9KT0lOX1BPSU5UX1BSRUZJWCk7DQogICAgICAgIGpvaW5Qb2ludC5h
cHBlbmQobWV0aG9kLmdldE5hbWUoKSk7DQogICAgICAgIGpvaW5Qb2ludC5hcHBlbmQoVHJh
bnNmb3JtYXRpb25VdGlsLkRFTElNSVRFUik7DQogICAgICAgIGpvaW5Qb2ludC5hcHBlbmQo
bWV0aG9kU2VxdWVuY2UpOw0KICAgICAgICByZXR1cm4gam9pblBvaW50Ow0KICAgIH0NCg0K
ICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIHByZWZpeGVkIG1ldGhvZCBuYW1lLg0KICAg
ICAqDQogICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kDQogICAgICogQHBhcmFtIG1l
dGhvZFNlcXVlbmNlIHRoZSBtZXRob2Qgc2VxdWVuY2UNCiAgICAgKiBAcmV0dXJuIHRoZSBu
YW1lIG9mIHRoZSBqb2luIHBvaW50DQogICAgICovDQogICAgcHJpdmF0ZSBTdHJpbmdCdWZm
ZXIgZ2V0UHJlZml4ZWRNZXRob2ROYW1lKGZpbmFsIE1ldGhvZCBtZXRob2QsDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtZXRo
b2RTZXF1ZW5jZSkgew0KICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgbWV0aG9kTmFtZSA9
IG5ldyBTdHJpbmdCdWZmZXIoKTsNCiAgICAgICAgbWV0aG9kTmFtZS5hcHBlbmQoVHJhbnNm
b3JtYXRpb25VdGlsLk9SSUdJTkFMX01FVEhPRF9QUkVGSVgpOw0KICAgICAgICBtZXRob2RO
YW1lLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpKTsNCiAgICAgICAgbWV0aG9kTmFtZS5hcHBl
bmQoVHJhbnNmb3JtYXRpb25VdGlsLkRFTElNSVRFUik7DQogICAgICAgIG1ldGhvZE5hbWUu
YXBwZW5kKG1ldGhvZFNlcXVlbmNlKTsNCiAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7DQog
ICAgfQ0KICAgIC8vL0NMT1ZFUjpPTg0KfQ0K
--------------000602030005030808020106--
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf