|
From: <jue...@we...> - 2003-09-23 12:46:31
|
SnVzdCB3b25kZXJpbmcgZnJvbSB5b3VyIGRlc2NyaXB0aW9uOiBXaHkgZG9lc24ndCB0aGUgc2Vu ZE1haWwgbWV0aG9kIHNpbXBseSB0YWtlIGEgTWFpbFNldHRpbmdzIHBhcmFtZXRlcj8gVGhlIGNh bGxiYWNrIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgdXNlIGFueSBwcmVwYXJlZCByZXNvdXJjZSBs aWtlIGEgSkRCQyBDb25uZWN0aW9uIG9yIEhpYmVybmF0ZSBTZXNzaW9uLCBzbyB3aHkgdXNlIGEg Y2FsbGJhY2sgYXQgYWxsPw0KIA0KQlRXLCB3ZSBzaG91bGQgZGVmaW5pdGVseSBhaW0gdG8gYWdy ZWUgb24gc3VjaCBwdWJsaWMgQVBJIGJlZm9yZSByZWxlYXNpbmcgMS4wIE0yLiBSZWxlYXNlZCBB UElzIHNob3VsZCBzdGF5IGFzIHN0YWJsZSBhcyBwb3NzaWJsZS4NCiANCkp1ZXJnZW4NCiANCg0K CS0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tIA0KCUZyb206IEtvcHlsZW5rbywgRG1pdHJ5IFtt YWlsdG86ZGtvcHlsZW5rb0BhY3MucnV0Z2Vycy5lZHVdIA0KCVNlbnQ6IFdlZCA5LzEwLzIwMDMg OTo1MSBQTSANCglUbzogJ3NwcmluZ2ZyYW1ld29yay1kZXZlbG9wZXJAbGlzdHMuc291cmNlZm9y Z2UubmV0JyANCglDYzogDQoJU3ViamVjdDogW1NwcmluZ2ZyYW1ld29yay1kZXZlbG9wZXJdIE1h aWwgc3VwcG9ydA0KCQ0KCQ0KDQoJSGVsbG8gZXZlcnlib2R5LCANCg0KCU5vdyB0aGVyZSBpcyBh IG5ldyBtYWlsIHN1cHBvcnQgaW4gdGhlIHBhY2thZ2Ugb3JnLnNwcmluZ2ZyYW1ld29yay5tYWls IA0KDQoJSXQgZm9sbG93cyB0aGUgY29uc2lzdGVudCBTcHJpbmcncyB0ZW1wbGF0ZS9jYWxsYmFj ayBwYXR0ZXJuLiBUaGUgY2VudHJhbCBjb21wb25lbnQgaXMgTWFpbFRlbXBsYXRlIHdoaWNoIHVz ZXMgTWFpbFNlbmRlciBzdHJhdGVneSAod2hpY2ggY291bGQgYmUgaW1wbGVtZW50ZWQgd2l0aCBh bnkgZW1haWwgcHJvdG9jb2wvQVBJKSBhbmQgTWFpbENhbGxiYWNrLiBUeXBpY2FsbHkgbWFpbFNl bmRlciBwcm9wZXJ0eSBvbiB0aGUgTWFpbFRlbXBsYXRlIGlzIHNldCB0aHJvdWdoIGFuIEFwcGxp Y2F0aW9uQ29udGV4dC4gTWFpbENhbGxiYWNrIGhhcyBvbmUgbWV0aG9kIGNvbmZpZ3VyZSgpIGlu IHdoaWNoIHRoZSBjbGllbnQncyBpbXBsZW1lbnRhdGlvbiB3b3VsZCBjb25maWd1cmUgdGhlIE1h aWxTZXR0aW5ncyB2YWx1ZSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIG5lZWRlZCB0byBzZW5kIG1h aWwuIEFsc28gdGhlIEphdmFNYWlsU2VuZGVyIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkLg0K DQoJRXhhbXBsZSB1c2FnZTogDQoNCglNYWlsVGVtcGxhdGUgbXQgPSBuZXcgTWFpbFRlbXBsYXRl KCk7IA0KCU1haWxTZW5kZXIgbXMgPSBuZXcgSmF2YU1haWxTZW5kZXIoKTsgDQoJbXQuc2V0TWFp bFNlbmRlcihtcyk7IA0KDQoJbXQuc2VuZE1haWwobmV3IE1haWxDYWxsYmFjaygpIHsgDQoJICAg ICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoTWFpbFNldHRpbmdzIG1haWxTZXR0aW5ncykgeyAN CgkgICAgICAgICAgICAgICAgICAgICAgICBtYWlsU2V0dGluZ3Muc2V0TWFpbFRvKCJ4eHhAeWFo b28uY29tIik7IA0KCSAgICAgICAgICAgICAgICAgICAgICAgIG1haWxTZXR0aW5ncy5zZXRNYWls RnJvbSgieHh4QG9yZy5zcHJpbmdmcmFtZXdvcmsuY29tIik7IA0KCSAgICAgICAgICAgICAgICAg ICAgICAgIG1haWxTZXR0aW5ncy5zZXRNYWlsU3ViamVjdCgidGVzdCIpOyANCgkgICAgICAgICAg ICAgICAgICAgICAgICBtYWlsU2V0dGluZ3Muc2V0TWFpbFRleHQoInRlc3QiKTsgDQoJICAgICAg ICAgICAgICAgICAgICAgICAgbWFpbFNldHRpbmdzLnNldE1haWxIb3N0KCJsb2NhbGhvc3QiKTsg DQoJICAgICAgICAgICAgICAgIH0gDQoJICAgICAgICB9KTsgDQoNCglSZWdhcmRzLCANCglEbWl0 cml5LiANCg0K |
|
From: <jue...@we...> - 2003-10-06 06:50:33
|
Um9kLCBEbWl0cml5LA0KIA0KSSBhZ3JlZSBpbiB0ZXJtcyBvZiBTdG9yZSBzdXBwb3J0IC0gbGV0 J3MgY29uY2VudHJhdGUgb24gbWFpbCBzZW5kaW5nIGZvciBub3cuIEkgYWxzbyB0ZW5kIHRvIGFn cmVlIGluIHRlcm1zIG9mIGFic3RyYWN0aW5nIEphdmFNYWlsIGZvciBzaW1wbGUgZW5vdWdoIG1h aWwgc2VuZGluZyByZXF1aXJlbWVudHMuIEkgZm9yZ290IHRoYXQgU2Vzc2lvbiBpcyBmaW5hbCwg QlRXLiBKYXZhTWFpbCBpcyByZWFsbHkgbWVzc3kgLSBBUEkgZGVzaWduIHNlZW1zIHRvIGJlIGFu IGFydC4uLiA7LSkNCiANClNvIGxldCBtZSBzdWdnZXN0IGEgbWVldC1pbi10aGUtbWlkZGxlIHNv bHV0aW9uOiBBcyBJJ3ZlIGluaXRpYWxseSBpbnRlbmRlZCwgbGV0J3Mgc2VwYXJhdGUgdHJhbnNw b3J0LXJlbGF0ZWQgKGhvc3QsIHVzZXJuYW1lLCBwYXNzd29yZCkgYW5kIG1lc3NhZ2UtcmVsYXRl ZCBwcm9wZXJ0aWVzLCBpLmUuIGRyb3AgTWFpbFNldHRpbmdzIGluIGl0cyBjdXJyZW50IGZvcm0s IG1vdmUgdHJhbnNwb3J0IHNldHRpbmdzIHRvIHRoZSBNYWlsU2VuZGVyIGltcGxlbWVudGF0aW9u LCBhbmQgaW50cm9kdWNlIGEgU2ltcGxlTWVzc2FnZSBjbGFzcy4NCiANCkFzIHRoZSBlZmZlY3Qg b2YgdGhlIGN1cnJlbnQgTWFpbFRlbXBsYXRlL01haWxDYWxsYmFjayBjb21ibyAob3ZlcnJpZGlu ZyBjZXJ0YWluIHByZS1kZWZpbmVkIG1haWwgc2V0dGluZ3MpIGNhbiBiZSBhY2hpZXZlZCB3aXRo IHVzaW5nIGEgU2ltcGxlTWVzc2FnZSBjb3B5IGNvbnN0cnVjdG9yLCBJIHN1Z2dlc3QgdG8gZHJv cCBNYWlsVGVtcGxhdGUgYW5kIE1haWxDYWxsYmFjay4gVGhpcyBsZWF2ZXMgU2ltcGxlTWVzc2Fn ZSwgTWFpbFNlbmRlciwgYW5kIGEgSmF2YU1haWxTZW5kZXIgaW1wbGVtZW50YXRpb24uDQogDQpU byBvZmZlciBtb3JlIHBvd2VyIGZvciB0aG9zZSB3aG8gbmVlZCBpdCwgSSBzdWdnZXN0IHRvIG9m ZmVyIGFkZGl0aW9uYWwgbWV0aG9kcyBpbiBKYXZhTWFpbFNlbmRlci4gV2hvZXZlciB3YW50cyB0 byB1c2UgdGhvc2Ugc2hvdWxkIGNhc3QgdG8gSmF2YU1haWxTZW5kZXIsIHJlc3BlY3RpdmVseSBv ZmZlciBhIGJlYW4gcHJvcGVydHkgb2YgdHlwZSBKYXZhTWFpbFNlbmRlciB0byBiZSBwb3B1bGF0 ZWQgYnkgYSBiZWFuIHJlZmVyZW5jZS4gQWxsIG90aGVyIGFwcGxpY2F0aW9uIGNsYXNzZXMgY2Fu IHdvcmsgd2l0aCB0aGUgTWFpbFNlbmRlciBpbnRlcmZhY2UuDQogDQpNYWlsU2VuZGVyIGludGVy ZmFjZSB1c2VycyBhcmUgZWFzaWx5IHRlc3RhYmxlIHdpdGggYSBtb2NrIE1haWxTZW5kZXIgaW1w bGVtZW50YXRpb24uIEl0IHdpbGwgYmUgYSBiaXQgaGFyZGVyIHdpdGggSmF2YU1haWxTZW5kZXIg dXNlcnMsIGJ1dCBzdGlsbCBwb3NzaWJsZTogQSBtb2NrIEphdmFNYWlsU2VuZGVyIHN1YmNsYXNz IHRoYXQgb3ZlcnJpZGVzIHNlbmQoTWltZU1lc3NhZ2UpIGFuZCBzZW5kKE1pbWVNZXNzYWdlW10p IHNob3VsZCBhbGxvdyBmb3IgZWFzeSB0ZXN0aW5nIHRvby4gTm90ZSB0aGF0IGEgY29ubmVjdGlv biB0byB0aGUgbWFpbCBzZXJ2ZXIgaXMgb25seSByZXF1aXJlZCBmb3IgYWN0dWFsIG1haWwgc2Vu ZGluZywgbm90IGZvciBTZXNzaW9uIHNldHVwLg0KIA0KcHVibGljIGNsYXNzIFNpbXBsZU1lc3Nh Z2V7DQogIHByaXZhdGUgU3RyaW5nIGZyb207DQogIHByaXZhdGUgU3RyaW5nIHRvOw0KICBwcml2 YXRlIFN0cmluZ1tdIGNjOw0KICBwcml2YXRlIFN0cmluZyBzdWJqZWN0Ow0KICBwcml2YXRlIFN0 cmluZyB0ZXh0Ow0KICANCiAgcHVibGljIFNpbXBsZU1lc3NhZ2UoU2ltcGxlTWVzc2FnZSBvcmln aW5hbCkgew0KICAgIC8vIGNvcHkgY29uc3RydWN0b3INCiAgfQ0KIA0KICAoZ2V0dGVycyBhbmQg c2V0dGVycykNCn0NCiANCnB1YmxpYyBpbnRlcmZhY2UgTWFpbFNlbmRlciB7DQogIHZvaWQgc2Vu ZChTaW1wbGVNZXNzYWdlIG1lc3NhZ2UpOw0KfQ0KIA0KcHVibGljIGNsYXNzIEphdmFNYWlsU2Vu ZGVyIGltcGxlbWVudHMgTWFpbFNlbmRlciwgSW5pdGlhbGl6aW5nQmVhbiB7DQogIHByaXZhdGUg U3RyaW5nIGhvc3Q7DQogIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lOw0KICBwcml2YXRlIFN0cmlu ZyBwYXNzd29yZDsNCiANCiAgKGdldHRlcnMgYW5kIHNldHRlcnMpDQogDQogIHB1YmxpYyB2b2lk IGFmdGVyUHJvcGVydGllc1NldCgpIHsNCiAgICAvLyBjcmVhdGUgYW5kIGtlZXAgU2Vzc2lvbiBp bnN0YW5jZQ0KICB9DQogDQogIHB1YmxpYyB2b2lkIHNlbmQoU2ltcGxlTWVzc2FnZSBtZXNzYWdl KSB7DQogICAgLy8gc2VuZCBTaW1wbGVNZXNzYWdlIHZpYSBKYXZhTWFpbA0KICAgIC8vIGNyZWF0 aW5nIGEgTWltZU1lc3NhZ2UgaW50ZXJuYWxseSBhbmQgZGVsZWdhdGluZyB0byBzZW5kKE1pbWVN ZXNzYWdlKQ0KIH0NCiANCiAgcHVibGljIHZvaWQgc2VuZChNaW1lTWVzc2FnZSBtZXNzYWdlKSB7 DQogICAgLy8gc2VuZCBKYXZhTWFpbCBNaW1lTWVzc2FnZQ0KICAgIC8vIHVzaW5nIGEgVHJhbnNw b3J0IGluc3RhbmNlOiBjb25uZWN0LCBzZW5kTWVzc2FnZSwgZGlzY29ubmVjdA0KICB9DQogDQog IHB1YmxpYyB2b2lkIHNlbmQoTWltZU1lc3NhZ2VbXSBtZXNzYWdlcykgew0KICAgIC8vIHNlbmQg bXVsdGlwbGUgSmF2YU1haWwgTWltZU1lc3NhZ2VzIGluIG9uZSBiYXRjaA0KICAgIC8vIHVzaW5n IGEgVHJhbnNwb3J0IGluc3RhbmNlOiBjb25uZWN0LCBtdWx0aXBsZSBzZW5kTWVzc2FnZSwgZGlz Y29ubmVjdA0KICB9DQogDQogIHB1YmxpYyBNaW1lTWVzc2FnZSBjcmVhdGVNaW1lTWVzc2FnZSgp IHsNCiAgICAvLyBjcmVhdGUgSmF2YU1haWwgTWltZU1lc3NhZ2UgZm9yIHRoZSBTZXNzaW9uIG9m IHRoaXMgc2VuZGVyDQogICAgLy8gbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgTWltZU1lc3NhZ2UoU2Vz c2lvbikgY29uc3RydWN0b3INCiAgfQ0KfQ0KIA0KSSBjb25zaWRlciB0aGlzIHRoZSBiZXN0IG9m IGJvdGggd29ybGRzLiBBcHBsaWNhdGlvbnMgY2FuIGNob29zZSB0byB1c2UgdGhlIGZ1bGwgYWJz dHJhY3Rpb24gKE1haWxTZW5kZXIpIGZvciBzaW1wbGUgcHVycG9zZXMsIG9yIHVzZSBKYXZhTWFp bFNlbmRlciBmb3IgbW9yZSBzb3BoaXN0aWNhdGVkIHJlcXVpcmVtZW50cy4gQXMgdGVzdGluZyBz dWNoIGFwcHMgZG9lcyBub3QgcmVxdWlyZSBtb2NraW5nIEphdmFNYWlsIGl0c2VsZiBpbiBhbnkg Y2FzZSwgd2Ugc2hvdWxkIGhhdmUgcmVhY2hlZCBhbGwgb3VyIGdvYWxzLg0KIA0KV2hhdCBkbyB5 b3UgdGhpbms/IElmIHdlIGFncmVlIG9uIHRoZSBBUEkgZGVzaWduLCBJJ2xsIGJlIGhhcHB5IHRv IHJld29yayBvdXIgbWFpbCBzdXBwb3J0IHRoYXQgd2F5IGZvciAxLjAgTTIuDQogDQpSZWdhcmRz LA0KSnVlcmdlbg0KIA0KIA0KDQoJLS0tLS1VcnNwcsO8bmdsaWNoZSBOYWNocmljaHQtLS0tLSAN CglWb246IFJvZCBKb2huc29uIFttYWlsdG86cm9kLmpvaG5zb25AaW50ZXJmYWNlMjEuY29tXSAN CglHZXNlbmRldDogU28gMDUuMTAuMjAwMyAxMTozOCANCglBbjogasO8cmdlbiBow7ZsbGVyIFt3 ZXJrM0FUXTsgS29weWxlbmtvLCBEbWl0cnkgDQoJQ2M6IA0KCUJldHJlZmY6IFJlOiBbU3ByaW5n ZnJhbWV3b3JrLWRldmVsb3Blcl0gTWFpbCBzdXBwb3J0DQoJDQoJDQoNCgk+IEFmdGVyIGluLWRl cHRoIGNvbnNpZGVyYXRpb24gb2YgdGhlIG1haWwgc2VuZGluZyByZXF1aXJlbWVudHMgaW4gd2Vy azNBVA0KCXByb2R1Y3RzIGFuZCBzdHVkeSBvZiB0aGUgSmF2YU1haWwgc3BlYywgSSdtIGluY2xp bmVkIHRvIHN1Z2dlc3QgYQ0KCXNpZ25pZmljYW50bHkgZGlmZmVyZW50IGtpbmQgb2YgbWFpbCBz dXBwb3J0IHRoYW4gdGhlIGN1cnJlbnQgb25lLiBUaGUgbWFpbg0KCXJlYXNvbnMgYXJlIGNlcnRh aW4gbGltaXRhdGlvbnMgb2YgdGhlIGN1cnJlbnQgU3ByaW5nIG1haWwgc2VuZGVyLCBub3QNCglh bGxvd2luZyBmb3IgcXVpdGUgYSBsb3Qgb2YgSmF2YU1haWwgZnVuY3Rpb25hbGl0eToNCgk+DQoJ PiAxLiBIb3cgdG8gc2VuZCBibGluZCBjb3BpZXMgKGJjYyk/DQoJPiAyLiBIb3cgdG8gc3BlY2lm eSBhIG5hbWUgZm9yIHNlbmRlciBvciByZWNpcGllbnQgYWRkcmVzc2VzICh0byBtYWtlIG1haWwN CgljbGllbnRzIHNob3cgc29tZXRoaW5nIGxpa2UgIkp1ZXJnZW4gSG9lbGxlciA8amhvQHdlcmsz YXQuY29tPiIpPw0KCT4gMy4gSG93IHRvIHNldCBhIGNoYXJzZXQgZm9yIHN1YmplY3QgYW5kIHRl eHQgKHZlcnkgaW1wb3J0YW50IGZvciBsb2NhbGl6ZWQNCgltYWlscyk/DQoJPiA0LiBIb3cgdG8g YXV0aGVudGljYXRlIGFnYWluc3QgdGhlIFNNVFAgc2VydmVyIGlmIG5lY2Vzc2FyeSAodXNlcm5h bWUsDQoJcGFzc3dvcmQpPw0KCT4gNS4gSG93IHRvIHNlbmQgbXVsdGlwbGUgbWVzc2FnZXMgaW4g YmF0Y2gsIHdpdGhpbiBhIHNpbmdsZSBtYWlsIHNlcnZlcg0KCWNvbm5lY3Rpb24/DQoJPiA2LiBI b3cgdG8gYWNjZXNzIGEgbWFpbCBzdG9yZSwgaS5lLiBhbiBpbmJveCBmb3IgcmVhZGluZyBtYWls cz8NCgk+DQoJPiBUaGUgZmlyc3QgdGhyZWUgcmVxdWlyZSB0aGUgb3B0aW9uIHRvIGNvbmZpZ3Vy ZSBhIE1pbWVNZXNzYWdlIGRpcmVjdGx5LA0KCWluc3RlYWQgb2YganVzdCBjcmVhdGluZyBvbmUg aW50ZXJuYWxseSBmcm9tIHNpbXBsaWZpZWQgYXJndW1lbnRzLiBUaGVyZSdzIGENCglsb3Qgb2Yg dXNlZnVsIGZ1bmN0aW9uYWxpdHkgaW4gdGhlcmUsIHdlIHNob3VsZCBub3QgdHJ5IHRvIGFic3Ry YWN0IHRoYXQgLQ0KCWp1c3Qgb2ZmZXIgc2ltcGxlIGNvbnZlbmllbmNlIG1ldGhvZHMgYXMgc2hv cnRjdXRzLg0KCT4NCgk+IE5yLiA0IGNhbiBiZSBvdmVyY29tZSBieSB0d28gbWVjaGFuaXNtcywg ZWl0aGVyIHBhc3NpbmcgYW4gQXV0aGVudGljYXRvcg0KCWltcGxlbWVudGF0aW9uIG9uIFNlc3Np b24uZ2V0SW5zdGFuY2UsIG9yIHVzaW5nIGEgVHJhbnNwb3J0IGluc3RhbmNlDQoJZXhwbGljaXRs eSwgcGFzc2luZyBob3N0LCB1c2VybmFtZSwgYW5kIHBhc3N3b3JkIG9uIHRoZSBjb25uZWN0IGNh bGwuDQoJRnVydGhlcm1vcmUsIGFuIGV4cGxpY2l0IFRyYW5zcG9ydCBpbnN0YW5jZSBhbGxvd3Mg dG8gc2VuZCBtdWx0aXBsZSBtZXNzYWdlcw0KCXdpdGhpbiBvbmUgY29ubmVjdGlvbiAtIE5yLiA1 Lg0KCT4NCgk+IE5yLiA2IG5lZWRzIHRoZSBvcHRpb24gdG8gd29yayB3aXRoaW4gYSBTdG9yZSwg YXMgb3Bwb3NlZCB0byBhIFRyYW5zcG9ydA0KCWZvciBzZW5kaW5nLg0KCQ0KCUknbSBub3Qgc3Vy ZSB3ZSBuZWVkIHRvIHdvcnJ5IGFib3V0IDYgbm93LCBzbyBsb25nIGFzIHdlIGNhbiBzdXBwb3J0 IGl0DQoJZXZlbnR1YWxseS4gSSB0aGluayBtb3N0IHBlb3BsZSBhcmUgaW50ZXJlc3RlZCBwcmlt YXJpbHkgaW4gc2VuZGluZyBtYWlsLg0KCQ0KCT4gU28gdGhlIG1vc3QgYXBwcm9wcmlhdGUgbWFp bCBzdXBwb3J0IHNlZW1zIHRvIG1lIGEgTWFpbFRlbXBsYXRlIGNsYXNzDQoJdGhhdCdzIGZvY3Vz ZWQgb24gbWFraW5nIEphdmFNYWlsIHVzYWdlIGVhc2llciByYXRoZXIgdGhhbiBnZW5lcmFsDQoJ YWJzdHJhY3Rpb24uIEkgZW52aXNhZ2UgdGhlIGZvbGxvd2luZyBiZWFuIHByb3BlcnRpZXM6DQoJ Pg0KCT4gLSB0cmFuc3BvcnRQcm90b2NvbCAoZGVmYXVsdCAic210cCIpOw0KCT4gLSBzdG9yZVBy b3RvY29sIChkZWZhdWx0ICJwb3AzIik7DQoJPiAtIHRyYW5zcG9ydEhvc3QgKGFrYSAibWFpbC5z bXRwLmhvc3QiKTsNCgk+IC0gc3RvcmVIb3N0IChha2EgIm1haWwucG9wMy5ob3N0Iik7DQoJPiAt IHVzZXJuYW1lIChkZWZhdWx0IGVtcHR5KTsNCgk+IC0gcGFzc3dvcmQgKGRlZmF1bHQgZW1wdHkp Lg0KCT4NCgk+IFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhbGxvdyB0byB3b3JrIHdpdGhpbiBhIHBy b3Blcmx5IG1hbmFnZWQgVHJhbnNwb3J0IG9yDQoJU3RvcmUgcmVzb3VyY2UsIGFuYWxvZ291cyB0 byBIaWJlcm5hdGVUZW1wbGF0ZSB3aXRoIGEgSGliZXJuYXRlIFNlc3Npb246DQoJPg0KCT4gLSBl eGVjdXRlSW5UcmFuc3BvcnQoTWFpbFRyYW5zcG9ydENhbGxiYWNrKTsNCgk+IC0gZXhlY3V0ZUlu U3RvcmUoTWFpbFN0b3JlQ2FsbGJhY2spOw0KCT4NCgk+IHdpdGggdGhlIGZvbGxvd2luZyBjYWxs YmFjayBpbnRlcmZhY2VzOg0KCT4NCgk+ICAgcHVibGljIGludGVyZmFjZSBNYWlsVHJhbnNwb3J0 Q2FsbGJhY2soKSB7DQoJPiAgICAgZG9JblRyYW5zcG9ydChTZXNzaW9uIHNlc3Npb24sIFRyYW5z cG9ydCB0cmFuc3BvcnQpOw0KCT4gICB9DQoJPg0KCT4gICBwdWJsaWMgaW50ZXJmYWNlIE1haWxT dG9yZUNhbGxiYWNrKCkgew0KCT4gICAgIGRvSW5TdG9yZShTZXNzaW9uIHNlc3Npb24sIFN0b3Jl IHN0b3JlKTsNCgk+ICAgfQ0KCT4NCgk+IE9mIGNvdXJzZSwgbGlrZSB3aXRoIEhpYmVybmF0ZVRl bXBsYXRlLCB0aGVyZSdzIGEgbG90IG9mIG9wcG9ydHVuaXR5IGZvcg0KCWNvbnZlbmllbmNlIG1l dGhvZHMgb24gTWFpbFRlbXBsYXRlLCB0byBhdm9pZCBoYXZpbmcgdG8gaW1wbGVtZW50IGENCglj YWxsYmFjazoganVzdCBmb3IgdHJhbnNwb3J0IHRob3VnaCwgYXMgc3RvcmUtcmVsYXRlZCB3b3Jr IHdpbGwgYWx3YXlzIGJlDQoJY3VzdG9tLg0KCT4NCgk+IC0gc2VuZE1lc3NhZ2UoTWltZU1lc3Nh Z2UpOw0KCT4gLSBzZW5kTWVzc2FnZXMoTWltZU1lc3NhZ2VbXSk7DQoJPiAtIHNlbmRNZXNzYWdl KFNpbXBsZU1lc3NhZ2UgbWVzc2FnZSk7DQoJPiAtIHNlbmRNZXNzYWdlKFN0cmluZyBmcm9tLCBT dHJpbmcgdG8sIFN0cmluZyBzdWJqZWN0LCBTdHJpbmcgdGV4dCk7DQoJPiAtIHNlbmRNZXNzYWdl KFN0cmluZyBmcm9tLCBTdHJpbmcgdG8sIFN0cmluZ1tdIGNjLCBTdHJpbmcgc3ViamVjdCwgU3Ry aW5nDQoJdGV4dCk7DQoJPiAtIGV0Yy4NCgk+DQoJPiBTbyBzZW5kaW5nIGEgcGxhaW4gbWVzc2Fn ZSBpcyBzdHJhaWdodGZvcndhcmQ6IFBvcHVsYXRlIGEgTWFpbFRlbXBsYXRlDQoJd2l0aCB0cmFu c3BvcnRIb3N0LCB1c2VybmFtZSwgYW5kIHBhc3N3b3JkIChlLmcuIGluIHRoZSBhcHBsaWNhdGlv bg0KCWNvbnRleHQpLCBwYXNzIGl0IHRvIHlvdXIgYXBwbGljYXRpb24gb2JqZWN0OyBpbnZva2Ug b25lIG9mIHRoZSBzZW5kTWVzc2FnZQ0KCW1ldGhvZHMuIEJ1dCBpZiB5b3UgbmVlZCBpdCwgdGhl IGZ1bGwgcG93ZXIgb2YgSmF2YU1haWwgaXMgYXQgeW91cg0KCWZpbmdlcnRpcHMgaW4gYSBjdXN0 b20gY2FsbGJhY2sgaW1wbGVtZW50YXRpb24hDQoJPg0KCT4gUHJlY29uZmlndXJpbmcgbWFpbCBz ZXR0aW5ncyBpcyBzdGlsbCBwb3NzaWJsZTogdGhlICJ0cmFuc3BvcnRIb3N0IiBpbiB0aGUNCglN YWlsVGVtcGxhdGUgaW5zdGFuY2UsIHRoZSBtYWlsIGFkZHJlc3NlcyBhbmQgY29udGVudHMgdmlh IFNpbXBsZU1lc3NhZ2UuDQoJVGhlIGxhdHRlciB3aXRoICJmcm9tIiwgInRvIiwgInN1YmplY3Qi LCAidGV4dCIsIGFuZCBhIGNvcHkgY29uc3RydWN0b3IgY2FuDQoJc2VydmUgdGhlIHJvbGUgb2Yg dGhlIGN1cnJlbnQgTWFpbFNldHRpbmdzLCBqdXN0IHdpdGhvdXQgImhvc3QiOiBhDQoJc2ltcGxp ZmllZCBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgYSBwbGFpbiBtZXNzYWdlLg0KCT4NCgk+ICAg U2ltcGxlTWVzc2FnZSBtc2cgPSBuZXcgU2ltcGxlTWVzc2FnZShwcmVjb25maWd1cmVkTWVzc2Fn ZSk7DQoJPiAgIG1zZy5zZXRYWFgoLi4uKTsNCgk+ICAgbWFpbFRlbXBsYXRlLnNlbmRNZXNzYWdl KG1zZyk7DQoJPg0KCT4gLS0tLS0NCgkNCglJIGFncmVlIHJlZ2FyZGluZyB1dGlsaXR5IG1ldGhv ZHMuIEkgbGlrZSB0aGUgcHJvcG9zZWQgQVBJIG1vZGVsIChjYWxsYmFja3MNCglvbmx5IGZvciBj dXN0b20gc3R1ZmYpLg0KCQ0KCT4gSSBrbm93IHRoYXQgdGhpcyBpcyBjb21wbGV0ZWx5IGRpZmZl cmVudCB0aGFuIHRoZSBjdXJyZW50IG1haWwgc3VwcG9ydA0KCW1vZGVsLiBUaGUgbWFpbiBkaWZm ZXJlbmNlIGlzIHRoYXQgdGhlcmUgaXMgbm8gYXR0ZW1wdCB0byBhYnN0cmFjdCBKYXZhTWFpbA0K CWNvbXBsZXRlbHksIHJhdGhlciBhIGhlbHBlciBmb3Igc2ltcGxpZmllZCB1c2FnZSBsaWtlIEhp YmVybmF0ZVRlbXBsYXRlLiBJDQoJZG9uJ3Qgc2VlIG11Y2ggdmFsdWUgaW4gY29tcGxldGUgYWJz dHJhY3Rpb24gYW55d2F5OiBXaGF0IGFsdGVybmF0aXZlDQoJaW1wbGVtZW50YXRpb25zIG1pZ2h0 IHRoZXJlIGJlPw0KCQ0KCUphdmFNYWlsIGlzIGEgbWVzc3kgQVBJLiBUaGVyZSBhcmUgYWx0ZXJu YXRpdmVzIHN1Y2ggYXMgdGhlIG9sZCBTdW4gbWFpbA0KCXBhY2thZ2VzLCB3aGljaCBJJ3ZlIHVz ZWQgc3VjY2Vzc2Z1bGx5LCB3aGljaCBhcmUgdXN1YWxseSBlYXNpZXIgdG8NCgljb25maWd1cmUu IEkgZG9uJ3QgdGhpbmsgSmF2YU1haWwgaXMgYSBncmVhdCBhYnN0cmFjdGlvbi4NCgkNCgk+IFJl Z2FyZGluZyB0ZXN0aW5nLCB0aGF0IHNob3VsZCBiZSBlYXNpZXIgd2l0aCB0aGUgYWJvdmUgbW9k ZWw6IEJlc2lkZXMNCglTZXNzaW9uLmdldEluc3RhbmNlLCBubyBzdGF0aWMgSmF2YU1haWwgbWV0 aG9kcyBhcmUgaW52b2x2ZWQsIGFzIFRyYW5zcG9ydA0KCWFuZCBTdG9yZSBhbmQgaGFuZGxlZCBh cyBpbnN0YW5jZXMuIFRodXMsIGlmIHdlIGlzb2xhdGUgdGhlDQoJU2Vzc2lvbi5nZXRJbnN0YW5j ZSBjYWxsIGluIGEgcHJvdGVjdGVkIG1ldGhvZCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gdGVzdA0K CW91ciBtYWlsIHN1cHBvcnQgd2l0aCBtb2NrIG9iamVjdHMsIGkuZS4gbW9jayBzdWJjbGFzc2Vz IG9mIFNlc3Npb24sDQoJVHJhbnNwb3J0LCBhbmQgU3RvcmUuDQoJDQoJU2Vzc2lvbiBpcyBmaW5h bC4gVHJhbnNwb3J0IGlzIG5vdCBhIHJlYWwgb2JqZWN0LS1pZSB0aGUgbW9zdCBpbXBvcnRhbnQN CgltZXRob2RzIGFyZSBzdGF0aWMuIEphdmFNYWlsIHN1Y2tzIGZyb20gYSB0ZXN0YWJpbGl0eSBw ZXJzcGVjdGl2ZSwgc28gSSdtDQoJbm90IHN1cmUgd2UgY2FuIGF2b2lkIHRob3NlIGxpbWl0YXRp b25zIHdpdGhvdXQgZ3JlYXRlciBhYnN0cmFjdGlvbi4NCgkNCgk+IFRoZSBtYWluIHJlYXNvbiB3 aHkgSSdtIHZlcnkga2VlbiBvbiBpbXBsZW1lbnRpbmcgdGhlIGFib3ZlIHN1cHBvcnQgaXMNCgl0 aGF0IHRoZSBjdXJyZW50IGFic3RyYWN0aW9uIGlzIHRvbyBzaW1wbGU6IEl0IGxvc2VzIG11Y2gg b2YgSmF2YU1haWwncw0KCXBvd2VyLiBJTU8sIHRoZSBiZXR0ZXIgdHJhZGVvZmYgaXMgdG8gd29y ayB3aXRoIEphdmFNYWlsIGV4Y2x1c2l2ZWx5IGFuZA0KCW1ha2UgaXRzIHVzYWdlIHNpbXBsZXIu DQoJDQoJSSB0aGluayBtb3JlIHBvd2VyIGlzIG5lZWRlZC4gSSdtIHN0aWxsIG5vdCBjb252aW5j ZWQgdGhhdCB3ZSBuZWVkIHRvIGJlDQoJSmF2YU1haWwgb25seSB0byBkZWxpdmVyIHRoYXQuDQoJ DQoJUmVnYXJkcywNCglSb2QNCgkNCgkNCgkNCg0K |
|
From: Darren D. <da...@da...> - 2003-10-06 22:03:24
|
Juergen, Rod, Dmitry, I just pricked my ears up some way into this discussion: > I know that this is completely different than the current mail support > model. The main difference is that there is no attempt to abstract > JavaMail completely, rather a helper for simplified usage like > HibernateTemplate. I don't see much value in complete abstraction anyway: > What alternative implementations might there be? Lotus Notes/Domino has an enormous corporate install base (many millions of seats), so an abstraction that allows plugability of either JavaMail or native Notes Mail might potentially be of great interest to some commercial users. Me for one! Notes servers can be configured to offer SMTP, but companies that use Notes tend only to use SMTP at gateway servers and rely on the native Notes mail services internally. Often, all mail destined for external (internet) recipients will still have to originate on internal mail servers with no SMTP. The API proposed would allow a Notes/Domino implementation using the interface MailSender, and SimpleMessage could probably be extended directly to offer the richer notes options and different handling of attachments and encryption to JavaMail. I'm not proposing adding such an implementation to Spring, but simply point out that it would be worthwhile to have the abstraction. Maybe a future example implementation and mini-project for the website or something would suffice. -- Darren Davison Public Key: http://www.davison.uk.net/key.jsp |
|
From: Kopylenko, D. <dko...@ac...> - 2003-10-06 11:52:58
|
Juergen,
The proposed API looks good to me.
Regards,
Dmitriy.
-----Original Message-----
From: j=FCrgen h=F6ller [werk3AT] [mailto:jue...@we...]=20
Sent: Monday, October 06, 2003 2:48 AM
To: Rod Johnson; Kopylenko, Dmitry
Cc: spr...@li...
Subject: Re: [Springframework-developer] Mail support
Rod, Dmitriy,
=20
I agree in terms of Store support - let's concentrate on mail sending =
for
now. I also tend to agree in terms of abstracting JavaMail for simple =
enough
mail sending requirements. I forgot that Session is final, BTW. =
JavaMail is
really messy - API design seems to be an art... ;-)
=20
So let me suggest a meet-in-the-middle solution: As I've initially =
intended,
let's separate transport-related (host, username, password) and
message-related properties, i.e. drop MailSettings in its current form, =
move
transport settings to the MailSender implementation, and introduce a
SimpleMessage class.
=20
As the effect of the current MailTemplate/MailCallback combo =
(overriding
certain pre-defined mail settings) can be achieved with using a
SimpleMessage copy constructor, I suggest to drop MailTemplate and
MailCallback. This leaves SimpleMessage, MailSender, and a =
JavaMailSender
implementation.
=20
To offer more power for those who need it, I suggest to offer =
additional
methods in JavaMailSender. Whoever wants to use those should cast to
JavaMailSender, respectively offer a bean property of type =
JavaMailSender to
be populated by a bean reference. All other application classes can =
work
with the MailSender interface.
=20
MailSender interface users are easily testable with a mock MailSender
implementation. It will be a bit harder with JavaMailSender users, but =
still
possible: A mock JavaMailSender subclass that overrides =
send(MimeMessage)
and send(MimeMessage[]) should allow for easy testing too. Note that a
connection to the mail server is only required for actual mail sending, =
not
for Session setup.
=20
public class SimpleMessage{
private String from;
private String to;
private String[] cc;
private String subject;
private String text;
=20
public SimpleMessage(SimpleMessage original) {
// copy constructor
}
=20
(getters and setters)
}
=20
public interface MailSender {
void send(SimpleMessage message);
}
=20
public class JavaMailSender implements MailSender, InitializingBean {
private String host;
private String username;
private String password;
=20
(getters and setters)
=20
public void afterPropertiesSet() {
// create and keep Session instance
}
=20
public void send(SimpleMessage message) {
// send SimpleMessage via JavaMail
// creating a MimeMessage internally and delegating to =
send(MimeMessage)
}
=20
public void send(MimeMessage message) {
// send JavaMail MimeMessage
// using a Transport instance: connect, sendMessage, disconnect
}
=20
public void send(MimeMessage[] messages) {
// send multiple JavaMail MimeMessages in one batch
// using a Transport instance: connect, multiple sendMessage, =
disconnect
}
=20
public MimeMessage createMimeMessage() {
// create JavaMail MimeMessage for the Session of this sender
// necessary because of MimeMessage(Session) constructor
}
}
=20
I consider this the best of both worlds. Applications can choose to use =
the
full abstraction (MailSender) for simple purposes, or use =
JavaMailSender for
more sophisticated requirements. As testing such apps does not require
mocking JavaMail itself in any case, we should have reached all our =
goals.
=20
What do you think? If we agree on the API design, I'll be happy to =
rework
our mail support that way for 1.0 M2.
=20
Regards,
Juergen
=20
=20
-----Urspr=FCngliche Nachricht-----=20
Von: Rod Johnson [mailto:rod...@in...]=20
Gesendet: So 05.10.2003 11:38=20
An: j=FCrgen h=F6ller [werk3AT]; Kopylenko, Dmitry=20
Cc:=20
Betreff: Re: [Springframework-developer] Mail support
=09
=09
> After in-depth consideration of the mail sending requirements in
werk3AT
products and study of the JavaMail spec, I'm inclined to suggest a
significantly different kind of mail support than the current one.
The main
reasons are certain limitations of the current Spring mail sender,
not
allowing for quite a lot of JavaMail functionality:
>
> 1. How to send blind copies (bcc)?
> 2. How to specify a name for sender or recipient addresses (to
make mail
clients show something like "Juergen Hoeller <jh...@we...>")?
> 3. How to set a charset for subject and text (very important for
localized
mails)?
> 4. How to authenticate against the SMTP server if necessary
(username,
password)?
> 5. How to send multiple messages in batch, within a single mail
server
connection?
> 6. How to access a mail store, i.e. an inbox for reading mails?
>
> The first three require the option to configure a MimeMessage
directly,
instead of just creating one internally from simplified arguments.
There's a
lot of useful functionality in there, we should not try to abstract
that -
just offer simple convenience methods as shortcuts.
>
> Nr. 4 can be overcome by two mechanisms, either passing an
Authenticator
implementation on Session.getInstance, or using a Transport instance
explicitly, passing host, username, and password on the connect
call.
Furthermore, an explicit Transport instance allows to send multiple
messages
within one connection - Nr. 5.
>
> Nr. 6 needs the option to work within a Store, as opposed to a
Transport
for sending.
=09
I'm not sure we need to worry about 6 now, so long as we can support
it
eventually. I think most people are interested primarily in sending
mail.
=09
> So the most appropriate mail support seems to me a MailTemplate
class
that's focused on making JavaMail usage easier rather than general
abstraction. I envisage the following bean properties:
>
> - transportProtocol (default "smtp");
> - storeProtocol (default "pop3");
> - transportHost (aka "mail.smtp.host");
> - storeHost (aka "mail.pop3.host");
> - username (default empty);
> - password (default empty).
>
> The following methods allow to work within a properly managed
Transport or
Store resource, analogous to HibernateTemplate with a Hibernate
Session:
>
> - executeInTransport(MailTransportCallback);
> - executeInStore(MailStoreCallback);
>
> with the following callback interfaces:
>
> public interface MailTransportCallback() {
> doInTransport(Session session, Transport transport);
> }
>
> public interface MailStoreCallback() {
> doInStore(Session session, Store store);
> }
>
> Of course, like with HibernateTemplate, there's a lot of
opportunity for
convenience methods on MailTemplate, to avoid having to implement a
callback: just for transport though, as store-related work will
always be
custom.
>
> - sendMessage(MimeMessage);
> - sendMessages(MimeMessage[]);
> - sendMessage(SimpleMessage message);
> - sendMessage(String from, String to, String subject, String
text);
> - sendMessage(String from, String to, String[] cc, String subject,
String
text);
> - etc.
>
> So sending a plain message is straightforward: Populate a
MailTemplate
with transportHost, username, and password (e.g. in the application
context), pass it to your application object; invoke one of the
sendMessage
methods. But if you need it, the full power of JavaMail is at your
fingertips in a custom callback implementation!
>
> Preconfiguring mail settings is still possible: the
"transportHost" in the
MailTemplate instance, the mail addresses and contents via
SimpleMessage.
The latter with "from", "to", "subject", "text", and a copy
constructor can
serve the role of the current MailSettings, just without "host": a
simplified object representation of a plain message.
>
> SimpleMessage msg =3D new SimpleMessage(preconfiguredMessage);
> msg.setXXX(...);
> mailTemplate.sendMessage(msg);
>
> -----
=09
I agree regarding utility methods. I like the proposed API model
(callbacks
only for custom stuff).
=09
> I know that this is completely different than the current mail
support
model. The main difference is that there is no attempt to abstract
JavaMail
completely, rather a helper for simplified usage like
HibernateTemplate. I
don't see much value in complete abstraction anyway: What
alternative
implementations might there be?
=09
JavaMail is a messy API. There are alternatives such as the old Sun
mail
packages, which I've used successfully, which are usually easier to
configure. I don't think JavaMail is a great abstraction.
=09
> Regarding testing, that should be easier with the above model:
Besides
Session.getInstance, no static JavaMail methods are involved, as
Transport
and Store and handled as instances. Thus, if we isolate the
Session.getInstance call in a protected method, we should be able to
test
our mail support with mock objects, i.e. mock subclasses of Session,
Transport, and Store.
=09
Session is final. Transport is not a real object--ie the most
important
methods are static. JavaMail sucks from a testability perspective,
so I'm
not sure we can avoid those limitations without greater abstraction.
=09
> The main reason why I'm very keen on implementing the above
support is
that the current abstraction is too simple: It loses much of
JavaMail's
power. IMO, the better tradeoff is to work with JavaMail exclusively
and
make its usage simpler.
=09
I think more power is needed. I'm still not convinced that we need
to be
JavaMail only to deliver that.
=09
Regards,
Rod
=09
=09
=09
|
|
From: <jue...@we...> - 2003-10-07 23:46:30
|
SSd2ZSBqdXN0IGNvbW1pdHRlZCB0aGUgcmV2aXNlZCB2ZXJzaW9uLiBJJ3ZlIHN0aWxsIHJlZmlu ZWQgdGhlIHByb3Bvc2FsIGEgYml0OyBmb3IgZXhhbXBsZSwgdGhlcmUncyBhIEphdmFNYWlsU2Vu ZGVyIGludGVyZmFjZSBub3cgKGV4dGVuZHMgTWFpbFNlbmRlcikgcGx1cyBhIEphdmFNYWlsU2Vu ZGVySW1wbCBpbXBsZW1lbnRhdGlvbi4NCiANCkZ1cnRoZXJtb3JlLCBJJ3ZlIHR1cm5lZCBNYWls RXhjZXB0aW9uIGludG8gYSBjaGVja2VkIGV4Y2VwdGlvbiwgYXMgZmFpbGVkIHNlbmRpbmcgY2Fu IHR5cGljYWxseSBiZSBoYW5kbGVkIGJ5IGFwcGxpY2F0aW9ucywgZS5nLiBhcyAic2VuZCBmYWls ZWQgLSBkbyB5b3Ugd2FudCB0byByZXRyeT8iIG1lc3NhZ2VzLiBUaGlzIG1pZ2h0IGJlIGNvbnRy b3ZlcnNpYWw7IGFueSBzdHJvbmcgb2JqZWN0aW9ucyBhZ2FpbnN0IHRoaXM/DQogDQpJJ3ZlIGFs c28gcmV2aXNlZCB0aGUgdGVzdCBzdWl0ZS4gV2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlv biBzdHJhdGVneSwgaXQncyBiZWVuIGVhc3kgdG8gdGVzdCBKYXZhTWFpbFNlbmRlckltcGwgd2l0 aCBhIFRyYW5zcG9ydCBtb2NrIChhcHBsaWVkIGJ5IG92ZXJyaWRpbmcgYSBwcm90ZWN0ZWQgZ2V0 VHJhbnNwb3J0IG1ldGhvZCkuIEkgZ3Vlc3Mgd2Ugd29uJ3QgbmVlZCBmdXJ0aGVyIHRlc3RzIHdp dGggYW4gU01UUCBzZXJ2ZXI7IGFmdGVyIGFsbCwgdGhhdCB3b3VsZCB0ZXN0IEphdmFNYWlsIHJh dGhlciB0aGFuIG91ciB3cmFwcGVyLg0KIA0KSnVlcmdlbg0KIA0KIA0KDQoJLS0tLS1VcnNwcsO8 bmdsaWNoZSBOYWNocmljaHQtLS0tLSANCglWb246IEtvcHlsZW5rbywgRG1pdHJ5IFttYWlsdG86 ZGtvcHlsZW5rb0BhY3MucnV0Z2Vycy5lZHVdIA0KCUdlc2VuZGV0OiBNbyAwNi4xMC4yMDAzIDEz OjUxIA0KCUFuOiBqw7xyZ2VuIGjDtmxsZXIgW3dlcmszQVRdOyAnUm9kIEpvaG5zb24nIA0KCUNj OiAnc3ByaW5nZnJhbWV3b3JrLWRldmVsb3BlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQnIA0KCUJl dHJlZmY6IFJFOiBbU3ByaW5nZnJhbWV3b3JrLWRldmVsb3Blcl0gTWFpbCBzdXBwb3J0DQoJDQoJ DQoNCglKdWVyZ2VuLA0KCQ0KCVRoZSBwcm9wb3NlZCBBUEkgbG9va3MgZ29vZCB0byBtZS4NCgkN CglSZWdhcmRzLA0KCURtaXRyaXkuDQoJDQoJLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCglG cm9tOiBqw7xyZ2VuIGjDtmxsZXIgW3dlcmszQVRdIFttYWlsdG86anVlcmdlbi5ob2VsbGVyQHdl cmszYXQuY29tXQ0KCVNlbnQ6IE1vbmRheSwgT2N0b2JlciAwNiwgMjAwMyAyOjQ4IEFNDQoJVG86 IFJvZCBKb2huc29uOyBLb3B5bGVua28sIERtaXRyeQ0KCUNjOiBzcHJpbmdmcmFtZXdvcmstZGV2 ZWxvcGVyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldA0KCVN1YmplY3Q6IFJlOiBbU3ByaW5nZnJhbWV3 b3JrLWRldmVsb3Blcl0gTWFpbCBzdXBwb3J0DQoJDQoJDQoJUm9kLCBEbWl0cml5LA0KCQ0KCUkg YWdyZWUgaW4gdGVybXMgb2YgU3RvcmUgc3VwcG9ydCAtIGxldCdzIGNvbmNlbnRyYXRlIG9uIG1h aWwgc2VuZGluZyBmb3INCglub3cuIEkgYWxzbyB0ZW5kIHRvIGFncmVlIGluIHRlcm1zIG9mIGFi c3RyYWN0aW5nIEphdmFNYWlsIGZvciBzaW1wbGUgZW5vdWdoDQoJbWFpbCBzZW5kaW5nIHJlcXVp cmVtZW50cy4gSSBmb3Jnb3QgdGhhdCBTZXNzaW9uIGlzIGZpbmFsLCBCVFcuIEphdmFNYWlsIGlz DQoJcmVhbGx5IG1lc3N5IC0gQVBJIGRlc2lnbiBzZWVtcyB0byBiZSBhbiBhcnQuLi4gOy0pDQoJ DQoJU28gbGV0IG1lIHN1Z2dlc3QgYSBtZWV0LWluLXRoZS1taWRkbGUgc29sdXRpb246IEFzIEkn dmUgaW5pdGlhbGx5IGludGVuZGVkLA0KCWxldCdzIHNlcGFyYXRlIHRyYW5zcG9ydC1yZWxhdGVk IChob3N0LCB1c2VybmFtZSwgcGFzc3dvcmQpIGFuZA0KCW1lc3NhZ2UtcmVsYXRlZCBwcm9wZXJ0 aWVzLCBpLmUuIGRyb3AgTWFpbFNldHRpbmdzIGluIGl0cyBjdXJyZW50IGZvcm0sIG1vdmUNCgl0 cmFuc3BvcnQgc2V0dGluZ3MgdG8gdGhlIE1haWxTZW5kZXIgaW1wbGVtZW50YXRpb24sIGFuZCBp bnRyb2R1Y2UgYQ0KCVNpbXBsZU1lc3NhZ2UgY2xhc3MuDQoJDQoJQXMgdGhlIGVmZmVjdCBvZiB0 aGUgY3VycmVudCBNYWlsVGVtcGxhdGUvTWFpbENhbGxiYWNrIGNvbWJvIChvdmVycmlkaW5nDQoJ Y2VydGFpbiBwcmUtZGVmaW5lZCBtYWlsIHNldHRpbmdzKSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCB1 c2luZyBhDQoJU2ltcGxlTWVzc2FnZSBjb3B5IGNvbnN0cnVjdG9yLCBJIHN1Z2dlc3QgdG8gZHJv cCBNYWlsVGVtcGxhdGUgYW5kDQoJTWFpbENhbGxiYWNrLiBUaGlzIGxlYXZlcyBTaW1wbGVNZXNz YWdlLCBNYWlsU2VuZGVyLCBhbmQgYSBKYXZhTWFpbFNlbmRlcg0KCWltcGxlbWVudGF0aW9uLg0K CQ0KCVRvIG9mZmVyIG1vcmUgcG93ZXIgZm9yIHRob3NlIHdobyBuZWVkIGl0LCBJIHN1Z2dlc3Qg dG8gb2ZmZXIgYWRkaXRpb25hbA0KCW1ldGhvZHMgaW4gSmF2YU1haWxTZW5kZXIuIFdob2V2ZXIg d2FudHMgdG8gdXNlIHRob3NlIHNob3VsZCBjYXN0IHRvDQoJSmF2YU1haWxTZW5kZXIsIHJlc3Bl Y3RpdmVseSBvZmZlciBhIGJlYW4gcHJvcGVydHkgb2YgdHlwZSBKYXZhTWFpbFNlbmRlciB0bw0K CWJlIHBvcHVsYXRlZCBieSBhIGJlYW4gcmVmZXJlbmNlLiBBbGwgb3RoZXIgYXBwbGljYXRpb24g Y2xhc3NlcyBjYW4gd29yaw0KCXdpdGggdGhlIE1haWxTZW5kZXIgaW50ZXJmYWNlLg0KCQ0KCU1h aWxTZW5kZXIgaW50ZXJmYWNlIHVzZXJzIGFyZSBlYXNpbHkgdGVzdGFibGUgd2l0aCBhIG1vY2sg TWFpbFNlbmRlcg0KCWltcGxlbWVudGF0aW9uLiBJdCB3aWxsIGJlIGEgYml0IGhhcmRlciB3aXRo IEphdmFNYWlsU2VuZGVyIHVzZXJzLCBidXQgc3RpbGwNCglwb3NzaWJsZTogQSBtb2NrIEphdmFN YWlsU2VuZGVyIHN1YmNsYXNzIHRoYXQgb3ZlcnJpZGVzIHNlbmQoTWltZU1lc3NhZ2UpDQoJYW5k IHNlbmQoTWltZU1lc3NhZ2VbXSkgc2hvdWxkIGFsbG93IGZvciBlYXN5IHRlc3RpbmcgdG9vLiBO b3RlIHRoYXQgYQ0KCWNvbm5lY3Rpb24gdG8gdGhlIG1haWwgc2VydmVyIGlzIG9ubHkgcmVxdWly ZWQgZm9yIGFjdHVhbCBtYWlsIHNlbmRpbmcsIG5vdA0KCWZvciBTZXNzaW9uIHNldHVwLg0KCQ0K CXB1YmxpYyBjbGFzcyBTaW1wbGVNZXNzYWdlew0KCSAgcHJpdmF0ZSBTdHJpbmcgZnJvbTsNCgkg IHByaXZhdGUgU3RyaW5nIHRvOw0KCSAgcHJpdmF0ZSBTdHJpbmdbXSBjYzsNCgkgIHByaXZhdGUg U3RyaW5nIHN1YmplY3Q7DQoJICBwcml2YXRlIFN0cmluZyB0ZXh0Ow0KCSANCgkgIHB1YmxpYyBT aW1wbGVNZXNzYWdlKFNpbXBsZU1lc3NhZ2Ugb3JpZ2luYWwpIHsNCgkgICAgLy8gY29weSBjb25z dHJ1Y3Rvcg0KCSAgfQ0KCQ0KCSAgKGdldHRlcnMgYW5kIHNldHRlcnMpDQoJfQ0KCQ0KCXB1Ymxp YyBpbnRlcmZhY2UgTWFpbFNlbmRlciB7DQoJICB2b2lkIHNlbmQoU2ltcGxlTWVzc2FnZSBtZXNz YWdlKTsNCgl9DQoJDQoJcHVibGljIGNsYXNzIEphdmFNYWlsU2VuZGVyIGltcGxlbWVudHMgTWFp bFNlbmRlciwgSW5pdGlhbGl6aW5nQmVhbiB7DQoJICBwcml2YXRlIFN0cmluZyBob3N0Ow0KCSAg cHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWU7DQoJICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCgkN CgkgIChnZXR0ZXJzIGFuZCBzZXR0ZXJzKQ0KCQ0KCSAgcHVibGljIHZvaWQgYWZ0ZXJQcm9wZXJ0 aWVzU2V0KCkgew0KCSAgICAvLyBjcmVhdGUgYW5kIGtlZXAgU2Vzc2lvbiBpbnN0YW5jZQ0KCSAg fQ0KCQ0KCSAgcHVibGljIHZvaWQgc2VuZChTaW1wbGVNZXNzYWdlIG1lc3NhZ2UpIHsNCgkgICAg Ly8gc2VuZCBTaW1wbGVNZXNzYWdlIHZpYSBKYXZhTWFpbA0KCSAgICAvLyBjcmVhdGluZyBhIE1p bWVNZXNzYWdlIGludGVybmFsbHkgYW5kIGRlbGVnYXRpbmcgdG8gc2VuZChNaW1lTWVzc2FnZSkN Cgl9DQoJDQoJICBwdWJsaWMgdm9pZCBzZW5kKE1pbWVNZXNzYWdlIG1lc3NhZ2UpIHsNCgkgICAg Ly8gc2VuZCBKYXZhTWFpbCBNaW1lTWVzc2FnZQ0KCSAgICAvLyB1c2luZyBhIFRyYW5zcG9ydCBp bnN0YW5jZTogY29ubmVjdCwgc2VuZE1lc3NhZ2UsIGRpc2Nvbm5lY3QNCgkgIH0NCgkNCgkgIHB1 YmxpYyB2b2lkIHNlbmQoTWltZU1lc3NhZ2VbXSBtZXNzYWdlcykgew0KCSAgICAvLyBzZW5kIG11 bHRpcGxlIEphdmFNYWlsIE1pbWVNZXNzYWdlcyBpbiBvbmUgYmF0Y2gNCgkgICAgLy8gdXNpbmcg YSBUcmFuc3BvcnQgaW5zdGFuY2U6IGNvbm5lY3QsIG11bHRpcGxlIHNlbmRNZXNzYWdlLCBkaXNj b25uZWN0DQoJICB9DQoJDQoJICBwdWJsaWMgTWltZU1lc3NhZ2UgY3JlYXRlTWltZU1lc3NhZ2Uo KSB7DQoJICAgIC8vIGNyZWF0ZSBKYXZhTWFpbCBNaW1lTWVzc2FnZSBmb3IgdGhlIFNlc3Npb24g b2YgdGhpcyBzZW5kZXINCgkgICAgLy8gbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgTWltZU1lc3NhZ2Uo U2Vzc2lvbikgY29uc3RydWN0b3INCgkgIH0NCgl9DQoJDQoJSSBjb25zaWRlciB0aGlzIHRoZSBi ZXN0IG9mIGJvdGggd29ybGRzLiBBcHBsaWNhdGlvbnMgY2FuIGNob29zZSB0byB1c2UgdGhlDQoJ ZnVsbCBhYnN0cmFjdGlvbiAoTWFpbFNlbmRlcikgZm9yIHNpbXBsZSBwdXJwb3Nlcywgb3IgdXNl IEphdmFNYWlsU2VuZGVyIGZvcg0KCW1vcmUgc29waGlzdGljYXRlZCByZXF1aXJlbWVudHMuIEFz IHRlc3Rpbmcgc3VjaCBhcHBzIGRvZXMgbm90IHJlcXVpcmUNCgltb2NraW5nIEphdmFNYWlsIGl0 c2VsZiBpbiBhbnkgY2FzZSwgd2Ugc2hvdWxkIGhhdmUgcmVhY2hlZCBhbGwgb3VyIGdvYWxzLg0K CQ0KCVdoYXQgZG8geW91IHRoaW5rPyBJZiB3ZSBhZ3JlZSBvbiB0aGUgQVBJIGRlc2lnbiwgSSds bCBiZSBoYXBweSB0byByZXdvcmsNCglvdXIgbWFpbCBzdXBwb3J0IHRoYXQgd2F5IGZvciAxLjAg TTIuDQoJDQoJUmVnYXJkcywNCglKdWVyZ2VuDQoJDQoJDQoJDQoJICAgICAgICAtLS0tLVVyc3By w7xuZ2xpY2hlIE5hY2hyaWNodC0tLS0tDQoJICAgICAgICBWb246IFJvZCBKb2huc29uIFttYWls dG86cm9kLmpvaG5zb25AaW50ZXJmYWNlMjEuY29tXQ0KCSAgICAgICAgR2VzZW5kZXQ6IFNvIDA1 LjEwLjIwMDMgMTE6MzgNCgkgICAgICAgIEFuOiBqw7xyZ2VuIGjDtmxsZXIgW3dlcmszQVRdOyBL b3B5bGVua28sIERtaXRyeQ0KCSAgICAgICAgQ2M6DQoJICAgICAgICBCZXRyZWZmOiBSZTogW1Nw cmluZ2ZyYW1ld29yay1kZXZlbG9wZXJdIE1haWwgc3VwcG9ydA0KCSAgICAgICANCgkgICAgICAg DQoJDQoJICAgICAgICA+IEFmdGVyIGluLWRlcHRoIGNvbnNpZGVyYXRpb24gb2YgdGhlIG1haWwg c2VuZGluZyByZXF1aXJlbWVudHMgaW4NCgl3ZXJrM0FUDQoJICAgICAgICBwcm9kdWN0cyBhbmQg c3R1ZHkgb2YgdGhlIEphdmFNYWlsIHNwZWMsIEknbSBpbmNsaW5lZCB0byBzdWdnZXN0IGENCgkg ICAgICAgIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGtpbmQgb2YgbWFpbCBzdXBwb3J0IHRoYW4g dGhlIGN1cnJlbnQgb25lLg0KCVRoZSBtYWluDQoJICAgICAgICByZWFzb25zIGFyZSBjZXJ0YWlu IGxpbWl0YXRpb25zIG9mIHRoZSBjdXJyZW50IFNwcmluZyBtYWlsIHNlbmRlciwNCglub3QNCgkg ICAgICAgIGFsbG93aW5nIGZvciBxdWl0ZSBhIGxvdCBvZiBKYXZhTWFpbCBmdW5jdGlvbmFsaXR5 Og0KCSAgICAgICAgPg0KCSAgICAgICAgPiAxLiBIb3cgdG8gc2VuZCBibGluZCBjb3BpZXMgKGJj Yyk/DQoJICAgICAgICA+IDIuIEhvdyB0byBzcGVjaWZ5IGEgbmFtZSBmb3Igc2VuZGVyIG9yIHJl Y2lwaWVudCBhZGRyZXNzZXMgKHRvDQoJbWFrZSBtYWlsDQoJICAgICAgICBjbGllbnRzIHNob3cg c29tZXRoaW5nIGxpa2UgIkp1ZXJnZW4gSG9lbGxlciA8amhvQHdlcmszYXQuY29tPiIpPw0KCSAg ICAgICAgPiAzLiBIb3cgdG8gc2V0IGEgY2hhcnNldCBmb3Igc3ViamVjdCBhbmQgdGV4dCAodmVy eSBpbXBvcnRhbnQgZm9yDQoJbG9jYWxpemVkDQoJICAgICAgICBtYWlscyk/DQoJICAgICAgICA+ IDQuIEhvdyB0byBhdXRoZW50aWNhdGUgYWdhaW5zdCB0aGUgU01UUCBzZXJ2ZXIgaWYgbmVjZXNz YXJ5DQoJKHVzZXJuYW1lLA0KCSAgICAgICAgcGFzc3dvcmQpPw0KCSAgICAgICAgPiA1LiBIb3cg dG8gc2VuZCBtdWx0aXBsZSBtZXNzYWdlcyBpbiBiYXRjaCwgd2l0aGluIGEgc2luZ2xlIG1haWwN CglzZXJ2ZXINCgkgICAgICAgIGNvbm5lY3Rpb24/DQoJICAgICAgICA+IDYuIEhvdyB0byBhY2Nl c3MgYSBtYWlsIHN0b3JlLCBpLmUuIGFuIGluYm94IGZvciByZWFkaW5nIG1haWxzPw0KCSAgICAg ICAgPg0KCSAgICAgICAgPiBUaGUgZmlyc3QgdGhyZWUgcmVxdWlyZSB0aGUgb3B0aW9uIHRvIGNv bmZpZ3VyZSBhIE1pbWVNZXNzYWdlDQoJZGlyZWN0bHksDQoJICAgICAgICBpbnN0ZWFkIG9mIGp1 c3QgY3JlYXRpbmcgb25lIGludGVybmFsbHkgZnJvbSBzaW1wbGlmaWVkIGFyZ3VtZW50cy4NCglU aGVyZSdzIGENCgkgICAgICAgIGxvdCBvZiB1c2VmdWwgZnVuY3Rpb25hbGl0eSBpbiB0aGVyZSwg d2Ugc2hvdWxkIG5vdCB0cnkgdG8gYWJzdHJhY3QNCgl0aGF0IC0NCgkgICAgICAgIGp1c3Qgb2Zm ZXIgc2ltcGxlIGNvbnZlbmllbmNlIG1ldGhvZHMgYXMgc2hvcnRjdXRzLg0KCSAgICAgICAgPg0K CSAgICAgICAgPiBOci4gNCBjYW4gYmUgb3ZlcmNvbWUgYnkgdHdvIG1lY2hhbmlzbXMsIGVpdGhl ciBwYXNzaW5nIGFuDQoJQXV0aGVudGljYXRvcg0KCSAgICAgICAgaW1wbGVtZW50YXRpb24gb24g U2Vzc2lvbi5nZXRJbnN0YW5jZSwgb3IgdXNpbmcgYSBUcmFuc3BvcnQgaW5zdGFuY2UNCgkgICAg ICAgIGV4cGxpY2l0bHksIHBhc3NpbmcgaG9zdCwgdXNlcm5hbWUsIGFuZCBwYXNzd29yZCBvbiB0 aGUgY29ubmVjdA0KCWNhbGwuDQoJICAgICAgICBGdXJ0aGVybW9yZSwgYW4gZXhwbGljaXQgVHJh bnNwb3J0IGluc3RhbmNlIGFsbG93cyB0byBzZW5kIG11bHRpcGxlDQoJbWVzc2FnZXMNCgkgICAg ICAgIHdpdGhpbiBvbmUgY29ubmVjdGlvbiAtIE5yLiA1Lg0KCSAgICAgICAgPg0KCSAgICAgICAg PiBOci4gNiBuZWVkcyB0aGUgb3B0aW9uIHRvIHdvcmsgd2l0aGluIGEgU3RvcmUsIGFzIG9wcG9z ZWQgdG8gYQ0KCVRyYW5zcG9ydA0KCSAgICAgICAgZm9yIHNlbmRpbmcuDQoJICAgICAgIA0KCSAg ICAgICAgSSdtIG5vdCBzdXJlIHdlIG5lZWQgdG8gd29ycnkgYWJvdXQgNiBub3csIHNvIGxvbmcg YXMgd2UgY2FuIHN1cHBvcnQNCglpdA0KCSAgICAgICAgZXZlbnR1YWxseS4gSSB0aGluayBtb3N0 IHBlb3BsZSBhcmUgaW50ZXJlc3RlZCBwcmltYXJpbHkgaW4gc2VuZGluZw0KCW1haWwuDQoJICAg ICAgIA0KCSAgICAgICAgPiBTbyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBtYWlsIHN1cHBvcnQgc2Vl bXMgdG8gbWUgYSBNYWlsVGVtcGxhdGUNCgljbGFzcw0KCSAgICAgICAgdGhhdCdzIGZvY3VzZWQg b24gbWFraW5nIEphdmFNYWlsIHVzYWdlIGVhc2llciByYXRoZXIgdGhhbiBnZW5lcmFsDQoJICAg ICAgICBhYnN0cmFjdGlvbi4gSSBlbnZpc2FnZSB0aGUgZm9sbG93aW5nIGJlYW4gcHJvcGVydGll czoNCgkgICAgICAgID4NCgkgICAgICAgID4gLSB0cmFuc3BvcnRQcm90b2NvbCAoZGVmYXVsdCAi c210cCIpOw0KCSAgICAgICAgPiAtIHN0b3JlUHJvdG9jb2wgKGRlZmF1bHQgInBvcDMiKTsNCgkg ICAgICAgID4gLSB0cmFuc3BvcnRIb3N0IChha2EgIm1haWwuc210cC5ob3N0Iik7DQoJICAgICAg ICA+IC0gc3RvcmVIb3N0IChha2EgIm1haWwucG9wMy5ob3N0Iik7DQoJICAgICAgICA+IC0gdXNl cm5hbWUgKGRlZmF1bHQgZW1wdHkpOw0KCSAgICAgICAgPiAtIHBhc3N3b3JkIChkZWZhdWx0IGVt cHR5KS4NCgkgICAgICAgID4NCgkgICAgICAgID4gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFsbG93 IHRvIHdvcmsgd2l0aGluIGEgcHJvcGVybHkgbWFuYWdlZA0KCVRyYW5zcG9ydCBvcg0KCSAgICAg ICAgU3RvcmUgcmVzb3VyY2UsIGFuYWxvZ291cyB0byBIaWJlcm5hdGVUZW1wbGF0ZSB3aXRoIGEg SGliZXJuYXRlDQoJU2Vzc2lvbjoNCgkgICAgICAgID4NCgkgICAgICAgID4gLSBleGVjdXRlSW5U cmFuc3BvcnQoTWFpbFRyYW5zcG9ydENhbGxiYWNrKTsNCgkgICAgICAgID4gLSBleGVjdXRlSW5T dG9yZShNYWlsU3RvcmVDYWxsYmFjayk7DQoJICAgICAgICA+DQoJICAgICAgICA+IHdpdGggdGhl IGZvbGxvd2luZyBjYWxsYmFjayBpbnRlcmZhY2VzOg0KCSAgICAgICAgPg0KCSAgICAgICAgPiAg IHB1YmxpYyBpbnRlcmZhY2UgTWFpbFRyYW5zcG9ydENhbGxiYWNrKCkgew0KCSAgICAgICAgPiAg ICAgZG9JblRyYW5zcG9ydChTZXNzaW9uIHNlc3Npb24sIFRyYW5zcG9ydCB0cmFuc3BvcnQpOw0K CSAgICAgICAgPiAgIH0NCgkgICAgICAgID4NCgkgICAgICAgID4gICBwdWJsaWMgaW50ZXJmYWNl IE1haWxTdG9yZUNhbGxiYWNrKCkgew0KCSAgICAgICAgPiAgICAgZG9JblN0b3JlKFNlc3Npb24g c2Vzc2lvbiwgU3RvcmUgc3RvcmUpOw0KCSAgICAgICAgPiAgIH0NCgkgICAgICAgID4NCgkgICAg ICAgID4gT2YgY291cnNlLCBsaWtlIHdpdGggSGliZXJuYXRlVGVtcGxhdGUsIHRoZXJlJ3MgYSBs b3Qgb2YNCglvcHBvcnR1bml0eSBmb3INCgkgICAgICAgIGNvbnZlbmllbmNlIG1ldGhvZHMgb24g TWFpbFRlbXBsYXRlLCB0byBhdm9pZCBoYXZpbmcgdG8gaW1wbGVtZW50IGENCgkgICAgICAgIGNh bGxiYWNrOiBqdXN0IGZvciB0cmFuc3BvcnQgdGhvdWdoLCBhcyBzdG9yZS1yZWxhdGVkIHdvcmsg d2lsbA0KCWFsd2F5cyBiZQ0KCSAgICAgICAgY3VzdG9tLg0KCSAgICAgICAgPg0KCSAgICAgICAg PiAtIHNlbmRNZXNzYWdlKE1pbWVNZXNzYWdlKTsNCgkgICAgICAgID4gLSBzZW5kTWVzc2FnZXMo TWltZU1lc3NhZ2VbXSk7DQoJICAgICAgICA+IC0gc2VuZE1lc3NhZ2UoU2ltcGxlTWVzc2FnZSBt ZXNzYWdlKTsNCgkgICAgICAgID4gLSBzZW5kTWVzc2FnZShTdHJpbmcgZnJvbSwgU3RyaW5nIHRv LCBTdHJpbmcgc3ViamVjdCwgU3RyaW5nDQoJdGV4dCk7DQoJICAgICAgICA+IC0gc2VuZE1lc3Nh Z2UoU3RyaW5nIGZyb20sIFN0cmluZyB0bywgU3RyaW5nW10gY2MsIFN0cmluZyBzdWJqZWN0LA0K CVN0cmluZw0KCSAgICAgICAgdGV4dCk7DQoJICAgICAgICA+IC0gZXRjLg0KCSAgICAgICAgPg0K CSAgICAgICAgPiBTbyBzZW5kaW5nIGEgcGxhaW4gbWVzc2FnZSBpcyBzdHJhaWdodGZvcndhcmQ6 IFBvcHVsYXRlIGENCglNYWlsVGVtcGxhdGUNCgkgICAgICAgIHdpdGggdHJhbnNwb3J0SG9zdCwg dXNlcm5hbWUsIGFuZCBwYXNzd29yZCAoZS5nLiBpbiB0aGUgYXBwbGljYXRpb24NCgkgICAgICAg IGNvbnRleHQpLCBwYXNzIGl0IHRvIHlvdXIgYXBwbGljYXRpb24gb2JqZWN0OyBpbnZva2Ugb25l IG9mIHRoZQ0KCXNlbmRNZXNzYWdlDQoJICAgICAgICBtZXRob2RzLiBCdXQgaWYgeW91IG5lZWQg aXQsIHRoZSBmdWxsIHBvd2VyIG9mIEphdmFNYWlsIGlzIGF0IHlvdXINCgkgICAgICAgIGZpbmdl cnRpcHMgaW4gYSBjdXN0b20gY2FsbGJhY2sgaW1wbGVtZW50YXRpb24hDQoJICAgICAgICA+DQoJ ICAgICAgICA+IFByZWNvbmZpZ3VyaW5nIG1haWwgc2V0dGluZ3MgaXMgc3RpbGwgcG9zc2libGU6 IHRoZQ0KCSJ0cmFuc3BvcnRIb3N0IiBpbiB0aGUNCgkgICAgICAgIE1haWxUZW1wbGF0ZSBpbnN0 YW5jZSwgdGhlIG1haWwgYWRkcmVzc2VzIGFuZCBjb250ZW50cyB2aWENCglTaW1wbGVNZXNzYWdl Lg0KCSAgICAgICAgVGhlIGxhdHRlciB3aXRoICJmcm9tIiwgInRvIiwgInN1YmplY3QiLCAidGV4 dCIsIGFuZCBhIGNvcHkNCgljb25zdHJ1Y3RvciBjYW4NCgkgICAgICAgIHNlcnZlIHRoZSByb2xl IG9mIHRoZSBjdXJyZW50IE1haWxTZXR0aW5ncywganVzdCB3aXRob3V0ICJob3N0IjogYQ0KCSAg ICAgICAgc2ltcGxpZmllZCBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgYSBwbGFpbiBtZXNzYWdl Lg0KCSAgICAgICAgPg0KCSAgICAgICAgPiAgIFNpbXBsZU1lc3NhZ2UgbXNnID0gbmV3IFNpbXBs ZU1lc3NhZ2UocHJlY29uZmlndXJlZE1lc3NhZ2UpOw0KCSAgICAgICAgPiAgIG1zZy5zZXRYWFgo Li4uKTsNCgkgICAgICAgID4gICBtYWlsVGVtcGxhdGUuc2VuZE1lc3NhZ2UobXNnKTsNCgkgICAg ICAgID4NCgkgICAgICAgID4gLS0tLS0NCgkgICAgICAgDQoJICAgICAgICBJIGFncmVlIHJlZ2Fy ZGluZyB1dGlsaXR5IG1ldGhvZHMuIEkgbGlrZSB0aGUgcHJvcG9zZWQgQVBJIG1vZGVsDQoJKGNh bGxiYWNrcw0KCSAgICAgICAgb25seSBmb3IgY3VzdG9tIHN0dWZmKS4NCgkgICAgICAgDQoJICAg ICAgICA+IEkga25vdyB0aGF0IHRoaXMgaXMgY29tcGxldGVseSBkaWZmZXJlbnQgdGhhbiB0aGUg Y3VycmVudCBtYWlsDQoJc3VwcG9ydA0KCSAgICAgICAgbW9kZWwuIFRoZSBtYWluIGRpZmZlcmVu Y2UgaXMgdGhhdCB0aGVyZSBpcyBubyBhdHRlbXB0IHRvIGFic3RyYWN0DQoJSmF2YU1haWwNCgkg ICAgICAgIGNvbXBsZXRlbHksIHJhdGhlciBhIGhlbHBlciBmb3Igc2ltcGxpZmllZCB1c2FnZSBs aWtlDQoJSGliZXJuYXRlVGVtcGxhdGUuIEkNCgkgICAgICAgIGRvbid0IHNlZSBtdWNoIHZhbHVl IGluIGNvbXBsZXRlIGFic3RyYWN0aW9uIGFueXdheTogV2hhdA0KCWFsdGVybmF0aXZlDQoJICAg ICAgICBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgdGhlcmUgYmU/DQoJICAgICAgIA0KCSAgICAgICAg SmF2YU1haWwgaXMgYSBtZXNzeSBBUEkuIFRoZXJlIGFyZSBhbHRlcm5hdGl2ZXMgc3VjaCBhcyB0 aGUgb2xkIFN1bg0KCW1haWwNCgkgICAgICAgIHBhY2thZ2VzLCB3aGljaCBJJ3ZlIHVzZWQgc3Vj Y2Vzc2Z1bGx5LCB3aGljaCBhcmUgdXN1YWxseSBlYXNpZXIgdG8NCgkgICAgICAgIGNvbmZpZ3Vy ZS4gSSBkb24ndCB0aGluayBKYXZhTWFpbCBpcyBhIGdyZWF0IGFic3RyYWN0aW9uLg0KCSAgICAg ICANCgkgICAgICAgID4gUmVnYXJkaW5nIHRlc3RpbmcsIHRoYXQgc2hvdWxkIGJlIGVhc2llciB3 aXRoIHRoZSBhYm92ZSBtb2RlbDoNCglCZXNpZGVzDQoJICAgICAgICBTZXNzaW9uLmdldEluc3Rh bmNlLCBubyBzdGF0aWMgSmF2YU1haWwgbWV0aG9kcyBhcmUgaW52b2x2ZWQsIGFzDQoJVHJhbnNw b3J0DQoJICAgICAgICBhbmQgU3RvcmUgYW5kIGhhbmRsZWQgYXMgaW5zdGFuY2VzLiBUaHVzLCBp ZiB3ZSBpc29sYXRlIHRoZQ0KCSAgICAgICAgU2Vzc2lvbi5nZXRJbnN0YW5jZSBjYWxsIGluIGEg cHJvdGVjdGVkIG1ldGhvZCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8NCgl0ZXN0DQoJICAgICAgICBv dXIgbWFpbCBzdXBwb3J0IHdpdGggbW9jayBvYmplY3RzLCBpLmUuIG1vY2sgc3ViY2xhc3NlcyBv ZiBTZXNzaW9uLA0KCSAgICAgICAgVHJhbnNwb3J0LCBhbmQgU3RvcmUuDQoJICAgICAgIA0KCSAg ICAgICAgU2Vzc2lvbiBpcyBmaW5hbC4gVHJhbnNwb3J0IGlzIG5vdCBhIHJlYWwgb2JqZWN0LS1p ZSB0aGUgbW9zdA0KCWltcG9ydGFudA0KCSAgICAgICAgbWV0aG9kcyBhcmUgc3RhdGljLiBKYXZh TWFpbCBzdWNrcyBmcm9tIGEgdGVzdGFiaWxpdHkgcGVyc3BlY3RpdmUsDQoJc28gSSdtDQoJICAg ICAgICBub3Qgc3VyZSB3ZSBjYW4gYXZvaWQgdGhvc2UgbGltaXRhdGlvbnMgd2l0aG91dCBncmVh dGVyIGFic3RyYWN0aW9uLg0KCSAgICAgICANCgkgICAgICAgID4gVGhlIG1haW4gcmVhc29uIHdo eSBJJ20gdmVyeSBrZWVuIG9uIGltcGxlbWVudGluZyB0aGUgYWJvdmUNCglzdXBwb3J0IGlzDQoJ ICAgICAgICB0aGF0IHRoZSBjdXJyZW50IGFic3RyYWN0aW9uIGlzIHRvbyBzaW1wbGU6IEl0IGxv c2VzIG11Y2ggb2YNCglKYXZhTWFpbCdzDQoJICAgICAgICBwb3dlci4gSU1PLCB0aGUgYmV0dGVy IHRyYWRlb2ZmIGlzIHRvIHdvcmsgd2l0aCBKYXZhTWFpbCBleGNsdXNpdmVseQ0KCWFuZA0KCSAg ICAgICAgbWFrZSBpdHMgdXNhZ2Ugc2ltcGxlci4NCgkgICAgICAgDQoJICAgICAgICBJIHRoaW5r IG1vcmUgcG93ZXIgaXMgbmVlZGVkLiBJJ20gc3RpbGwgbm90IGNvbnZpbmNlZCB0aGF0IHdlIG5l ZWQNCgl0byBiZQ0KCSAgICAgICAgSmF2YU1haWwgb25seSB0byBkZWxpdmVyIHRoYXQuDQoJICAg ICAgIA0KCSAgICAgICAgUmVnYXJkcywNCgkgICAgICAgIFJvZA0KCSAgICAgICANCgkgICAgICAg DQoJICAgICAgIA0KCQ0KCQ0KDQo= |