ZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdHJ1bmsvb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uZGF0YWJhc2UubWF4ZGIvLmNsYXNzcGF0aCBiL2V4dGVuc2lvbnMvdHJ1bmsvb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uZGF0YWJhc2UubWF4ZGIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0YjcxYy4uMDAwMDAwMAotLS0gYS9leHRlbnNpb25zL3RydW5rL29yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLmRhdGFiYXNlLm1heGRiLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJjbGFzc2VzIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90cnVuay9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5kYXRhYmFzZS5tYXhkYi8ucHJvamVjdCBiL2V4dGVuc2lvbnMvdHJ1bmsvb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uZGF0YWJhc2UubWF4ZGIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTY2NDUuLjAwMDAwMDAKLS0tIGEvZXh0ZW5zaW9ucy90cnVuay9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5kYXRhYmFzZS5tYXhkYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uZGF0YWJhc2UubWF4ZGI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90cnVuay9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5kYXRhYmFzZS5tYXhkYi9idWlsZC5wcm9wZXJ0aWVzIGIvZXh0ZW5zaW9ucy90cnVuay9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5kYXRhYmFzZS5tYXhkYi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjgzNjIyLi4wMDAwMDAwCi0tLSBhL2V4dGVuc2lvbnMvdHJ1bmsvb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uZGF0YWJhc2UubWF4ZGIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIyBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIA0KLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gDQotIyBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgDQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgICB0d2FyZSAtIE1heERCIEVYVEVOU0lPTiBJTkNVQkFUT1IgLSBFbmhhbmNlbWVudCBidWcgMjg0NjU3DQotIyAgICAgDQotIyBUaGlzIGNvZGUgaXMgYmVpbmcgZGV2ZWxvcGVkIHVuZGVyIElOQ1VCQVRJT04gYW5kIGlzIG5vdCBjdXJyZW50bHkgaW5jbHVkZWQgDQotIyBpbiB0aGUgYXV0b21hdGVkIEVjbGlwc2VMaW5rIGJ1aWxkLiBUaGUgQVBJIGluIHRoaXMgY29kZSBtYXkgY2hhbmdlLCBvciANCi0jIG1heSBuZXZlciBiZSBpbmNsdWRlZCBpbiB0aGUgcHJvZHVjdC4gUGxlYXNlIHByb3ZpZGUgZmVlZGJhY2sgdGhyb3VnaCBtYWlsaW5nIA0KLSMgbGlzdHMgb3IgdGhlIGJ1ZyBkYXRhYmFzZS4NCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+DQotdHJ1bmsuZGlyPS4uLy4uLy4uLy4uL3RydW5rDQotc291cmNlLi4gPSBzcmMvDQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90cnVuay9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5kYXRhYmFzZS5tYXhkYi9idWlsZC54bWwgYi9leHRlbnNpb25zL3RydW5rL29yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLmRhdGFiYXNlLm1heGRiL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhYzUxMi4uMDAwMDAwMAotLS0gYS9leHRlbnNpb25zL3RydW5rL29yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLmRhdGFiYXNlLm1heGRiL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIA0KLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiANCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4NCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgdHdhcmUgLSBNYXhEQiBFWFRFTlNJT04gSU5DVUJBVE9SIC0gRW5oYW5jZW1lbnQgYnVnIDI4NDY1Nw0KLSAqICAgICANCi0gKiBUaGlzIGNvZGUgaXMgYmVpbmcgZGV2ZWxvcGVkIHVuZGVyIElOQ1VCQVRJT04gYW5kIGlzIG5vdCBjdXJyZW50bHkgaW5jbHVkZWQgDQotICogaW4gdGhlIGF1dG9tYXRlZCBFY2xpcHNlTGluayBidWlsZC4gVGhlIEFQSSBpbiB0aGlzIGNvZGUgbWF5IGNoYW5nZSwgb3IgDQotICogbWF5IG5ldmVyIGJlIGluY2x1ZGVkIGluIHRoZSBwcm9kdWN0LiBQbGVhc2UgcHJvdmlkZSBmZWVkYmFjayB0aHJvdWdoIG1haWxpbmcgDQotICogbGlzdHMgb3IgdGhlIGJ1ZyBkYXRhYmFzZS4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPg0KLTxwcm9qZWN0IG5hbWU9ImV4dGVuc2lvbi5wbGF0Zm9ybS5tYXhkYiIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4iPg0KLQ0KLSAgICA8cHJvcGVydHkgZmlsZT0iLi9idWlsZC5wcm9wZXJ0aWVzIi8+DQotICAgIDxwcm9wZXJ0eSBmaWxlPSIke3RydW5rLmRpcn0vYnVpbGQucHJvcGVydGllcyIvPg0KLQkNCi0gICAgPCEtLSBTZXQgQ29tcGlsZSBQYXRoLS0+DQotICAgIDxwYXRoIGlkPSJjb21waWxlLnBhdGgiPg0KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dHJ1bmsuZGlyfS8ke2VjbGlwc2VsaW5rLmphci5uYW1lfSIvPg0KLSAgICA8L3BhdGg+DQotCQ0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJjbGVhbixjb21waWxlIiAvPg0KLQkNCi0gICAgPCEtLSBjbGVhbiAtLT4NCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkNsZWFuIGFsbCBnZW5lcmF0ZWQgY29udGVudCI+DQotICAgICAgICA8ZGVsZXRlIGluY2x1ZGVFbXB0eURpcnM9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSI+DQotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSIvPg0KLSAgICAgICAgPC9kZWxldGU+DQotICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICA8IS0tIGNvbXBpbGUgLS0+DQotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249IkNvbXBpbGUgTWF4REJQbGF0Zm9ybSI+DQotICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIvPg0KLSAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSINCi0gICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSINCi0gICAgICAgICAgICAgICBpbmNsdWRlcz0iKiovKi5qYXZhIg0KLSAgICAgICAgICAgICAgIGRlYnVnPSIke2phdmFjLmRlYnVnfSINCi0gICAgICAgICAgICAgICBvcHRpbWl6ZT0iJHtqYXZhYy5vcHRpbWl6ZX0iDQotICAgICAgICAgICAgICAgc291cmNlPSIke2phdmFjLnZlcnNpb259Ig0KLSAgICAgICAgICAgICAgIHRhcmdldD0iJHtqYXZhYy52ZXJzaW9ufSINCi0gICAgICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtqYXZhYy5kZXByZWNhdGlvbn0iDQotICAgICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiDQotICAgICAgICAgICAgICAgbWVtb3J5TWF4aW11bVNpemU9IjUxMm0iDQotICAgICAgICAgICAgICAgZm9yaz0idHJ1ZSINCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNvbXBpbGUucGF0aCINCi0gICAgICAgIC8+DQotICAgIDwvdGFyZ2V0Pg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3RydW5rL29yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLmRhdGFiYXNlLm1heGRiL3JlYWRtZS50eHQgYi9leHRlbnNpb25zL3RydW5rL29yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLmRhdGFiYXNlLm1heGRiL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YmQzM2IuLjAwMDAwMDAKLS0tIGEvZXh0ZW5zaW9ucy90cnVuay9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5kYXRhYmFzZS5tYXhkYi9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TZWUgdGhlIGZvbGxvd2luZyBwYWdlIGZvciBkZXRhaWxzIG9mIHRoaXMgaW5jdWJhdG9yIHByb2plY3Q6DQotDQotaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRWNsaXBzZUxpbmsvRGV2ZWxvcG1lbnQvSW5jdWJhdG9yL0V4dGVuc2lvbnMvTWF4REJQbGF0Zm9ybQ0KLQ0KLVNlZSB0aGUgZm9sbG93aW5nIHBhZ2UgZm9yIGRldGFpbHMgb2YgdGhlIGV4dGVuc2lvbnMgaW5jdWJhdG9yOg0KLQ0KLWh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VjbGlwc2VMaW5rL0RldmVsb3BtZW50L0luY3ViYXRvci9FeHRlbnNpb25zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90cnVuay9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5kYXRhYmFzZS5tYXhkYi9zcmMvb3JnL2VjbGlwc2UvcGVyc2lzdGVuY2UvZXh0ZW5zaW9ucy9wbGF0Zm9ybS9kYXRhYmFzZS9NYXhEQlBsYXRmb3JtLmphdmEgYi9leHRlbnNpb25zL3RydW5rL29yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLmRhdGFiYXNlLm1heGRiL3NyYy9vcmcvZWNsaXBzZS9wZXJzaXN0ZW5jZS9leHRlbnNpb25zL3BsYXRmb3JtL2RhdGFiYXNlL01heERCUGxhdGZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmYTgyNi4uMDAwMDAwMAotLS0gYS9leHRlbnNpb25zL3RydW5rL29yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLmRhdGFiYXNlLm1heGRiL3NyYy9vcmcvZWNsaXBzZS9wZXJzaXN0ZW5jZS9leHRlbnNpb25zL3BsYXRmb3JtL2RhdGFiYXNlL01heERCUGxhdGZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSwyMDEwIE1hcmt1cyBLYXJnLCBTQVAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlDQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4NCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLg0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIE1hcmt1cyBLYXJnIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSAqIEFuZHJlYXMgRmlzY2hiYWNoIC0gZ2V0IHRlc3RzIHJ1bm5pbmcgd2l0aCBtYXhkYg0KLSAqDQotICogVGhpcyBjb2RlIGlzIGJlaW5nIGRldmVsb3BlZCB1bmRlciBJTkNVQkFUSU9OIGFuZCBpcyBub3QgY3VycmVudGx5IGluY2x1ZGVkDQotICogaW4gdGhlIGF1dG9tYXRlZCBFY2xpcHNlTGluayBidWlsZC4gVGhlIEFQSSBpbiB0aGlzIGNvZGUgbWF5IGNoYW5nZSwgb3INCi0gKiBtYXkgbmV2ZXIgYmUgaW5jbHVkZWQgaW4gdGhlIHByb2R1Y3QuIFBsZWFzZSBwcm92aWRlIGZlZWRiYWNrIHRocm91Z2ggbWFpbGluZw0KLSAqIGxpc3RzIG9yIHRoZSBidWcgZGF0YWJhc2UuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLmRhdGFiYXNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsNCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLWltcG9ydCBqYXZhLnNxbC5CbG9iOw0KLWltcG9ydCBqYXZhLnNxbC5DbG9iOw0KLWltcG9ydCBqYXZhLnNxbC5EYXRlOw0KLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247DQotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsNCi1pbXBvcnQgamF2YS5zcWwuVGltZTsNCi1pbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5leHByZXNzaW9ucy5FeHByZXNzaW9uT3BlcmF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmV4cHJlc3Npb25zLkxpc3RFeHByZXNzaW9uT3BlcmF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLmRhdGFiYXNlYWNjZXNzLkRhdGFiYXNlQ2FsbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuZGF0YWJhc2VhY2Nlc3MuRmllbGRUeXBlRGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuaGVscGVyLkNsYXNzQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5oZWxwZXIuRGF0YWJhc2VUYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucXVlcmllcy5WYWx1ZVJlYWRRdWVyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuc2NoZW1hZnJhbWV3b3JrLkZpZWxkRGVmaW5pdGlvbjsNCi0NCi0vKioNCi0gKiBQcm92aWRlcyBNYXhEQiBzcGVjaWZpYyBiZWhhdmlvdXIuDQotICoNCi0gKiBAYXV0aG9yIE1hcmt1cyBLQVJHIChtYXJrdXNAaGVhZGNyYXNoaW5nLmV1KQ0KLSAqIEBhdXRob3IgYWZpc2NoYmFjaCA8sCkpKT48DQotICogQGF1dGhvciBhZ29lcmxlcg0KLSAqIEBhdXRob3IgU2FiaW5lIEhlaWRlciAoc2FiaW5lLmhlaWRlckBzYXAuY29tKQ0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQ0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXhEQlBsYXRmb3JtIGV4dGVuZHMgRGF0YWJhc2VQbGF0Zm9ybSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQklOQVJZX0xFTkdUSCA9IDgwMDA7IC8vIEZJWE1FIHJldmlldyB0aGlzDQotDQotICAgIC8qKg0KLSAgICAgKiBNYXhpbXVtIGxlbmd0aCBvZiB0eXBlIFZBUkNIQVIgVU5JQ09ERQ0KLSAgICAgKg0KLSAgICAgKiAoe0BsaW5rIGh0dHA6Ly9tYXhkYi5zYXAuY29tL2RvYy83XzgvNDUvMzMzMzdkOWZhZjJiMzRlMTAwMDAwMDBhMTU1M2Y3L2NvbnRlbnQuaHRtfSkNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVkFSQ0hBUl9VTklDT0RFX0xFTkdUSCA9IDQwMDA7IC8vDQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvclVwZGF0ZUNvbXBhdGlibGVXaXRoRGlzdGluY3QoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0Rm9yVXBkYXRlU3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuICIgV0lUSCBMT0NLIEVYQ0xVU0lWRSI7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0Rm9yVXBkYXRlTm9XYWl0U3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuICIgV0lUSCBMT0NLIChOT1dBSVQpIEVYQ0xVU0lWRSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1heERCUGxhdGZvcm0oKXsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgICAgICB0aGlzLnBpbmdTUUwgPSAiU0VMRUNUIDEgRlJPTSBEVUFMIjsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIEhhc2h0YWJsZSBidWlsZEZpZWxkVHlwZXMoKSB7DQotICAgICAgICBmaW5hbCBIYXNodGFibGU8Q2xhc3MsIEZpZWxkVHlwZURlZmluaXRpb24+IGZpZWxkVHlwZU1hcHBpbmcgPSBuZXcgSGFzaHRhYmxlPENsYXNzLCBGaWVsZFR5cGVEZWZpbml0aW9uPigpOw0KLSAgICAgICAgZmllbGRUeXBlTWFwcGluZy5wdXQoQm9vbGVhbi5jbGFzcywgbmV3IEZpZWxkVHlwZURlZmluaXRpb24oIlNNQUxMSU5UIiwgZmFsc2UpKTsgLy8gVE9ETyBib29sZWFuDQotICAgICAgICBmaWVsZFR5cGVNYXBwaW5nLnB1dChOdW1iZXIuY2xhc3MsIG5ldyBGaWVsZFR5cGVEZWZpbml0aW9uKCJET1VCTEUgUFJFQ0lTSU9OIiwgZmFsc2UpKTsNCi0gICAgICAgIGZpZWxkVHlwZU1hcHBpbmcucHV0KFNob3J0LmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiU01BTExJTlQiLCBmYWxzZSkpOw0KLSAgICAgICAgZmllbGRUeXBlTWFwcGluZy5wdXQoSW50ZWdlci5jbGFzcywgbmV3IEZpZWxkVHlwZURlZmluaXRpb24oIklOVEVHRVIiLCBmYWxzZSkpOw0KLSAgICAgICAgZmllbGRUeXBlTWFwcGluZy5wdXQoTG9uZy5jbGFzcywgbmV3IEZpZWxkVHlwZURlZmluaXRpb24oIkZJWEVEIiwgMTkpKTsNCi0gICAgICAgIGZpZWxkVHlwZU1hcHBpbmcucHV0KEZsb2F0LmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiRkxPQVQiLCBmYWxzZSkpOw0KLSAgICAgICAgZmllbGRUeXBlTWFwcGluZy5wdXQoRG91YmxlLmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiRE9VQkxFIFBSRUNJU0lPTiIsIGZhbHNlKSk7DQotDQotICAgICAgICBmaWVsZFR5cGVNYXBwaW5nLnB1dChCaWdJbnRlZ2VyLmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiRklYRUQiLDE5KSk7DQotICAgICAgICBmaWVsZFR5cGVNYXBwaW5nLnB1dChCaWdEZWNpbWFsLmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiRklYRUQiLCAzOCkpOw0KLQ0KLSAgICAgICAgZmllbGRUeXBlTWFwcGluZy5wdXQoQ2hhcmFjdGVyLmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiQ0hBUiIsIDEsICJVTklDT0RFIikpOw0KLSAgICAgICAgZmllbGRUeXBlTWFwcGluZy5wdXQoQ2hhcmFjdGVyW10uY2xhc3MsIG5ldyBGaWVsZFR5cGVEZWZpbml0aW9uKCJWQVJDSEFSIiwgMjU1LCAiVU5JQ09ERSIpKTsNCi0gICAgICAgIGZpZWxkVHlwZU1hcHBpbmcucHV0KGNoYXJbXS5jbGFzcywgbmV3IEZpZWxkVHlwZURlZmluaXRpb24oIlZBUkNIQVIiLCAyNTUsICJVTklDT0RFIikpOw0KLSAgICAgICAgZmllbGRUeXBlTWFwcGluZy5wdXQoU3RyaW5nLmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiVkFSQ0hBUiIsIDI1NSwgIlVOSUNPREUiKSk7DQotDQotICAgICAgICBmaWVsZFR5cGVNYXBwaW5nLnB1dChCeXRlLmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiU01BTExJTlQiLCBmYWxzZSkpOw0KLSAgICAgICAgZmllbGRUeXBlTWFwcGluZy5wdXQoQnl0ZVtdLmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiQ0hBUiIsIDI1NSwgIkJZVEUiKSk7DQotICAgICAgICBmaWVsZFR5cGVNYXBwaW5nLnB1dChieXRlW10uY2xhc3MsIG5ldyBGaWVsZFR5cGVEZWZpbml0aW9uKCJDSEFSIiwgMjU1LCAiQllURSIpKTsNCi0gICAgICAgIGZpZWxkVHlwZU1hcHBpbmcucHV0KEJsb2IuY2xhc3MsIG5ldyBGaWVsZFR5cGVEZWZpbml0aW9uKCJMT05HIEJZVEUiLCBmYWxzZSkpOw0KLSAgICAgICAgZmllbGRUeXBlTWFwcGluZy5wdXQoQ2xvYi5jbGFzcywgbmV3IEZpZWxkVHlwZURlZmluaXRpb24oIkxPTkcgVU5JQ09ERSIsIGZhbHNlKSk7DQotDQotICAgICAgICBmaWVsZFR5cGVNYXBwaW5nLnB1dChEYXRlLmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiREFURSIsIGZhbHNlKSk7DQotICAgICAgICBmaWVsZFR5cGVNYXBwaW5nLnB1dChUaW1lLmNsYXNzLCBuZXcgRmllbGRUeXBlRGVmaW5pdGlvbigiVElNRSIsIGZhbHNlKSk7DQotICAgICAgICBmaWVsZFR5cGVNYXBwaW5nLnB1dChUaW1lc3RhbXAuY2xhc3MsIG5ldyBGaWVsZFR5cGVEZWZpbml0aW9uKCJUSU1FU1RBTVAiLCBmYWxzZSkpOw0KLSAgICAgICAgcmV0dXJuIGZpZWxkVHlwZU1hcHBpbmc7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzSW5kaXZpZHVhbFRhYmxlTG9ja2luZygpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgLyoqDQotICAgICAqIEVjbGlwc2VMaW5rIGRvZXMgbm90IHN1cHBvcnQgbGVuZ3RoIGRlcGVuZGVudCB0eXBlIG1hcHBpbmcuDQotICAgICAqIE1hcCBiaW5hcnkgdHlwZXMgd2l0aCBsZW5ndGggPiBNQVhfQklOQVJZX0xFTkdUSCB0byBMT05HIEJZVEUgKGkuZS4gYmxvYik7IHNob3J0ZXIgdHlwZXMgdG8gQ0hBUiAobikgQllURQ0KLSAgICAgKiBNYXAgdmFyY2hhciB0eXBlcyB3aXRoIGxlbmd0aCA+IE1BWF9WQVJDSEFSX1VOSUNPREVfTEVOR1RIIHRvIExPTkcgVU5JQ09ERSAoaS5lIGNsb2IpOyBzaG9ydGVyIHR5cGVzIHRvIFZBUkNIQVIgKG4pIFVOSUNPREUNCi0gICAgICogU2VlIGFsc28gYnVncyAzMTc1OTcsIDMxNzQ0OA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaWVsZFR5cGVTaXplKFdyaXRlciB3cml0ZXIsIEZpZWxkRGVmaW5pdGlvbiBmaWVsZCwgRmllbGRUeXBlRGVmaW5pdGlvbiBmaWVsZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBmaWVsZFR5cGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgLyogYnl0ZVtdIDwgODAwMCBtYXAgdG8gQ0hBUiBCWVRFLCBsb25nZXIgb25lcyB0byBMT05HIEJZVEUgKi8NCi0gICAgICAgIENsYXNzIGphdmFGaWVsZFR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7DQotICAgICAgICBpZiggKCBqYXZhRmllbGRUeXBlID09IG51bGwgJiYgIkNIQVIiLmVxdWFscyh0eXBlTmFtZSkgJiYgIkJZVEUiLmVxdWFscyhmaWVsZFR5cGUuZ2V0VHlwZXN1ZmZpeCgpKSkgfHwNCi0gICAgICAgICAgICAgICAgKGphdmFGaWVsZFR5cGUgIT0gbnVsbCAmJiAoamF2YUZpZWxkVHlwZS5lcXVhbHMoQnl0ZVtdLmNsYXNzKSB8fCBqYXZhRmllbGRUeXBlLmVxdWFscyhieXRlW10uY2xhc3MpKSkgKSB7DQotICAgICAgICAgICAgaWYoZmllbGQuZ2V0U2l6ZSgpID4gTUFYX0JJTkFSWV9MRU5HVEggfHwgZmllbGQuZ2V0U2l6ZSgpID09IDApICB7DQotICAgICAgICAgICAgICAgZmllbGRUeXBlID0gbmV3IEZpZWxkVHlwZURlZmluaXRpb24oIkxPTkcgQllURSIsIGZhbHNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKCJWQVJDSEFSIi5lcXVhbHModHlwZU5hbWUpICYmICJVTklDT0RFIi5lcXVhbHMoZmllbGRUeXBlLmdldFR5cGVzdWZmaXgoKSkpIHsNCi0gICAgICAgICAgICBpZiAoZmllbGQuZ2V0U2l6ZSgpID4gTUFYX1ZBUkNIQVJfVU5JQ09ERV9MRU5HVEgpIHsNCi0gICAgICAgICAgICAgICAgZmllbGRUeXBlID0gbmV3IEZpZWxkVHlwZURlZmluaXRpb24oIkxPTkcgVU5JQ09ERSIsIGZhbHNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotDQotICAgICAgICBzdXBlci5wcmludEZpZWxkVHlwZVNpemUod3JpdGVyLCBmaWVsZCwgZmllbGRUeXBlKTsNCi0gICAgICAgIGlmIChmaWVsZFR5cGUuZ2V0VHlwZXN1ZmZpeCgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCIgIiArIGZpZWxkVHlwZS5nZXRUeXBlc3VmZml4KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0aWFsaXplUGxhdGZvcm1PcGVyYXRvcnMoKSB7DQotICAgICAgICBzdXBlci5pbml0aWFsaXplUGxhdGZvcm1PcGVyYXRvcnMoKTsNCi0gICAgICAgIHRoaXMuYWRkT3BlcmF0b3IoTWF4REJQbGF0Zm9ybS5jcmVhdGVDb25jYXRFeHByZXNzaW9uT3BlcmF0b3IoKSk7DQotICAgICAgICB0aGlzLmFkZE9wZXJhdG9yKE1heERCUGxhdGZvcm0uY3JlYXRlVHJpbTJFeHByZXNzaW9uT3BlcmF0b3IoKSk7DQotICAgICAgICB0aGlzLmFkZE9wZXJhdG9yKE1heERCUGxhdGZvcm0uY3JlYXRlVG9OdW1iZXJPcGVyYXRvcigpKTsNCi0gICAgICAgIHRoaXMuYWRkT3BlcmF0b3IoTWF4REJQbGF0Zm9ybS5jcmVhdGVOdWxsaWZPcGVyYXRvcigpKTsNCi0gICAgICAgIHRoaXMuYWRkT3BlcmF0b3IoTWF4REJQbGF0Zm9ybS5jcmVhdGVDb2FsZXNjZU9wZXJhdG9yKCkpOw0KLSAgICAgICAgdGhpcy5hZGRPcGVyYXRvcihNYXhEQlBsYXRmb3JtLmNyZWF0ZVRvZGF5RXhwcmVzc2lvbk9wZXJhdG9yKCkpOw0KLSAgICAgICAgdGhpcy5hZGRPcGVyYXRvcihNYXhEQlBsYXRmb3JtLmNyZWF0ZUN1cnJlbnREYXRlRXhwcmVzc2lvbk9wZXJhdG9yKCkpOw0KLSAgICAgICAgdGhpcy5hZGRPcGVyYXRvcihNYXhEQlBsYXRmb3JtLmNyZWF0ZUN1cnJlbnRUaW1lRXhwcmVzc2lvbk9wZXJhdG9yKCkpOw0KLSAgICAgICAgdGhpcy5hZGROb25CaW5kaW5nT3BlcmF0b3IoTWF4REJQbGF0Zm9ybS5jcmVhdGVOdWxsVmFsdWVPcGVyYXRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uT3BlcmF0b3IgY3JlYXRlQ29uY2F0RXhwcmVzc2lvbk9wZXJhdG9yKCkgew0KLSAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25PcGVyYXRvci5zaW1wbGVMb2dpY2FsTm9QYXJlbnMoRXhwcmVzc2lvbk9wZXJhdG9yLkNvbmNhdCwgInx8Iik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgdGhlIGV4cHJlc3Npb24gb3BlcmF0b3IgcmVwcmVzZW50aW5nIHRoZSBKUFFMIGZ1bmN0aW9uIGN1cnJlbnRfdGltZXN0YW1wIGFzIGRlZmluZWQgYnkgpyA0LjYuMTcuMi4zIG9mIHRoZSBKUEEgMi4wIHNwZWNpZmljYXRpb24NCi0gICAgICoNCi0gICAgICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBvcGVyYXRvciByZXByZXNlbnRpbmcgdGhlIEpQUUwgZnVuY3Rpb24gY3VycmVudF90aW1lc3RhbXAgYXMgZGVmaW5lZCBieSCnIDQuNi4xNy4yLjMgb2YgdGhlIEpQQSAyLjAgc3BlY2lmaWNhdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbk9wZXJhdG9yIGNyZWF0ZVRvZGF5RXhwcmVzc2lvbk9wZXJhdG9yKCkgew0KLSAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25PcGVyYXRvci5zaW1wbGVMb2dpY2FsTm9QYXJlbnMoRXhwcmVzc2lvbk9wZXJhdG9yLlRvZGF5LCAiVElNRVNUQU1QIik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgdGhlIGV4cHJlc3Npb24gb3BlcmF0b3IgcmVwcmVzZW50aW5nIHRoZSBKUFFMIGZ1bmN0aW9uIGN1cnJlbnRfZGF0ZSBhcyBkZWZpbmVkIGJ5IKcgNC42LjE3LjIuMyBvZiB0aGUgSlBBIDIuMCBzcGVjaWZpY2F0aW9uDQotICAgICAqDQotICAgICAqIEByZXR1cm4gdGhlIGV4cHJlc3Npb24gb3BlcmF0b3IgcmVwcmVzZW50aW5nIHRoZSBKUFFMIGZ1bmN0aW9uIGN1cnJlbnRfZGF0ZSBhcyBkZWZpbmVkIGJ5IKcgNC42LjE3LjIuMyBvZiB0aGUgSlBBIDIuMCBzcGVjaWZpY2F0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uT3BlcmF0b3IgY3JlYXRlQ3VycmVudERhdGVFeHByZXNzaW9uT3BlcmF0b3IoKSB7DQotICAgICAgICByZXR1cm4gRXhwcmVzc2lvbk9wZXJhdG9yLnNpbXBsZUxvZ2ljYWxOb1BhcmVucyhFeHByZXNzaW9uT3BlcmF0b3IuQ3VycmVudERhdGUsICJEQVRFIik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgdGhlIGV4cHJlc3Npb24gb3BlcmF0b3IgcmVwcmVzZW50aW5nIHRoZSBKUFFMIGZ1bmN0aW9uIGN1cnJlbnRfdGltZXN0YW1wIGFzIGRlZmluZWQgYnkgpyA0LjYuMTcuMi4zIG9mIHRoZSBKUEEgMi4wIHNwZWNpZmljYXRpb24NCi0gICAgICoNCi0gICAgICogQHJldHVybiB0aGUgZXhwcmVzc2lvbiBvcGVyYXRvciByZXByZXNlbnRpbmcgdGhlIEpQUUwgZnVuY3Rpb24gY3VycmVudF90aW1lc3RhbXAgYXMgZGVmaW5lZCBieSCnIDQuNi4xNy4yLjMgb2YgdGhlIEpQQSAyLjAgc3BlY2lmaWNhdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbk9wZXJhdG9yIGNyZWF0ZUN1cnJlbnRUaW1lRXhwcmVzc2lvbk9wZXJhdG9yKCkgew0KLSAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25PcGVyYXRvci5zaW1wbGVMb2dpY2FsTm9QYXJlbnMoRXhwcmVzc2lvbk9wZXJhdG9yLkN1cnJlbnRUaW1lLCAiVElNRSIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25PcGVyYXRvciBjcmVhdGVUcmltMkV4cHJlc3Npb25PcGVyYXRvcigpIHsNCi0gICAgICAgIHJldHVybiBFeHByZXNzaW9uT3BlcmF0b3Iuc2ltcGxlVHdvQXJndW1lbnRGdW5jdGlvbihFeHByZXNzaW9uT3BlcmF0b3IuVHJpbTIsICJUUklNIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbk9wZXJhdG9yIGNyZWF0ZU51bGxWYWx1ZU9wZXJhdG9yKCkgew0KLSAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25PcGVyYXRvci5zaW1wbGVUd29Bcmd1bWVudEZ1bmN0aW9uKEV4cHJlc3Npb25PcGVyYXRvci5OdmwsICJWQUxVRSIpOw0KLSAgICB9DQotDQotICAgIC8qIHNlZSBidWcgMzE2Nzc0ICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25PcGVyYXRvciBjcmVhdGVDb2FsZXNjZU9wZXJhdG9yKCkgew0KLSAgICAgICAgTGlzdEV4cHJlc3Npb25PcGVyYXRvciBvcGVyYXRvciA9IChMaXN0RXhwcmVzc2lvbk9wZXJhdG9yKSBFeHByZXNzaW9uT3BlcmF0b3IuY29hbGVzY2UoKTsNCi0gICAgICAgIG9wZXJhdG9yLnNldFN0YXJ0U3RyaW5nKCJWQUxVRSgiKTsNCi0gICAgICAgIG9wZXJhdG9yLnNldFNlbGVjdG9yKEV4cHJlc3Npb25PcGVyYXRvci5Db2FsZXNjZSk7DQotICAgICAgICByZXR1cm4gb3BlcmF0b3I7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbk9wZXJhdG9yIGNyZWF0ZVRvTnVtYmVyT3BlcmF0b3IoKSB7DQotICAgICAgICByZXR1cm4gRXhwcmVzc2lvbk9wZXJhdG9yLnNpbXBsZUZ1bmN0aW9uKEV4cHJlc3Npb25PcGVyYXRvci5Ub051bWJlciwgIk5VTSIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25PcGVyYXRvciBjcmVhdGVOdWxsaWZPcGVyYXRvcigpIHsNCi0gICAgICAgIEV4cHJlc3Npb25PcGVyYXRvciBleE9wZXJhdG9yID0gbmV3IEV4cHJlc3Npb25PcGVyYXRvcigpOw0KLSAgICAgICAgZXhPcGVyYXRvci5zZXRUeXBlKEV4cHJlc3Npb25PcGVyYXRvci5GdW5jdGlvbk9wZXJhdG9yKTsNCi0gICAgICAgIGV4T3BlcmF0b3Iuc2V0U2VsZWN0b3IoRXhwcmVzc2lvbk9wZXJhdG9yLk51bGxJZik7DQotICAgICAgICBWZWN0b3IgdiA9IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLmhlbHBlci5Ob25TeW5jaHJvbml6ZWRWZWN0b3IubmV3SW5zdGFuY2UoNCk7DQotICAgICAgICB2LmFkZEVsZW1lbnQoIiAoQ0FTRSBXSEVOICIpOw0KLSAgICAgICAgdi5hZGRFbGVtZW50KCIgPSAiKTsNCi0gICAgICAgIHYuYWRkRWxlbWVudCgiIFRIRU4gTlVMTCBFTFNFICIpOw0KLSAgICAgICAgdi5hZGRFbGVtZW50KCIgRU5EKSAiKTsNCi0gICAgICAgIGV4T3BlcmF0b3IucHJpbnRzQXModik7DQotICAgICAgICBleE9wZXJhdG9yLmJlUHJlZml4KCk7DQotICAgICAgICBpbnRbXSBpbmRpY2VzID0gezAsIDEsIDB9Ow0KLSAgICAgICAgZXhPcGVyYXRvci5zZXRBcmd1bWVudEluZGljZXMoaW5kaWNlcyk7DQotICAgICAgICBleE9wZXJhdG9yLnNldE5vZGVDbGFzcyhDbGFzc0NvbnN0YW50cy5GdW5jdGlvbkV4cHJlc3Npb25fQ2xhc3MpOw0KLSAgICAgICAgcmV0dXJuIGV4T3BlcmF0b3I7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZE9wdGltaXplRGF0YUNvbnZlcnNpb24oKSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gVE9ETyBpcyB0aGlzIG5lZWRlZD8gKHNlZW1zIHRvIGRlZmF1bHQgdG8gdHJ1ZSkNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTm9uQmluZGluZ09wZXJhdG9yKEV4cHJlc3Npb25PcGVyYXRvciBvcGVyYXRvcikgew0KLSAgICAgICAgb3BlcmF0b3Iuc2V0SXNCaW5kaW5nU3VwcG9ydGVkKGZhbHNlKTsNCi0gICAgICAgIGFkZE9wZXJhdG9yKG9wZXJhdG9yKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3VwcG9ydHNOYXRpdmVTZXF1ZW5jZU51bWJlcnMoKSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGZpbmFsIFZhbHVlUmVhZFF1ZXJ5IGJ1aWxkU2VsZWN0UXVlcnlGb3JTZXF1ZW5jZU9iamVjdChmaW5hbCBTdHJpbmcgc2VxdWVuY2VOYW1lLCBmaW5hbCBJbnRlZ2VyIHNpemUpIHsNCi0gICAgICAgIHJldHVybiBuZXcgVmFsdWVSZWFkUXVlcnkoIlNFTEVDVCAiICsgdGhpcy5nZXRRdWFsaWZpZWRTZXF1ZW5jZU5hbWUoc2VxdWVuY2VOYW1lKSArICIuTkVYVFZBTCBGUk9NIERVQUwiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRDcmVhdGVUZW1wVGFibGVTcWxQcmVmaXgoKSB7DQotICAgICAgICByZXR1cm4gIkNSRUFURSBUQUJMRSAiOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldE1heEZpZWxkTmFtZVNpemUoKSB7DQotICAgICAgICByZXR1cm4gMzI7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZ2V0UXVhbGlmaWVkU2VxdWVuY2VOYW1lKGZpbmFsIFN0cmluZyBzZXF1ZW5jZU5hbWUpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmdldFRhYmxlUXVhbGlmaWVyKCkubGVuZ3RoKCkgPT0gMCA/IHNlcXVlbmNlTmFtZSA6IHRoaXMuZ2V0VGFibGVRdWFsaWZpZXIoKSArICIuIiArIHNlcXVlbmNlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3VwcG9ydHNMb2NhbFRlbXBUYWJsZXMoKSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGZpbmFsIERhdGFiYXNlVGFibGUgZ2V0VGVtcFRhYmxlRm9yVGFibGUoZmluYWwgRGF0YWJhc2VUYWJsZSB0YWJsZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEYXRhYmFzZVRhYmxlKCIkIiArIHRhYmxlLmdldE5hbWUoKSwgIlRFTVAiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNYXhEQigpIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRBbHdheXNVc2VUZW1wU3RvcmFnZUZvck1vZGlmeUFsbCgpIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCaW5kTGl0ZXJhbHMoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZFByaW50T3V0ZXJKb2luSW5XaGVyZUNsYXVzZSgpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkVXNlSkRCQ091dGVySm9pblN5bnRheCgpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXF1ZW5jZU9iamVjdHMoKSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3VwcG9ydHNTdG9yZWRGdW5jdGlvbnMoKSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gY2FuQmF0Y2hXcml0ZVdpdGhPcHRpbWlzdGljTG9ja2luZyhEYXRhYmFzZUNhbGwgY2FsbCkgew0KLSAgICAJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgZXhlY3V0ZUJhdGNoKFN0YXRlbWVudCBzdGF0ZW1lbnQsIGJvb2xlYW4gaXNTdGF0ZW1lbnRQcmVwYXJlZCkNCi0JCQl0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCi0JCWlmIChpc1N0YXRlbWVudFByZXBhcmVkKSB7DQotCQkJc3RhdGVtZW50LmV4ZWN1dGVCYXRjaCgpOw0KLQkJCXJldHVybiBzdGF0ZW1lbnQuZ2V0VXBkYXRlQ291bnQoKTsNCi0JCX0gZWxzZSB7DQotCQkJaW50W10gdXBkYXRlQ291bnRzID0gc3RhdGVtZW50LmV4ZWN1dGVCYXRjaCgpOw0KLQkJCXJldHVybiB1cGRhdGVDb3VudHMubGVuZ3RoOw0KLQkJfQ0KLQl9DQotDQotfQ0K